home *** CD-ROM | disk | FTP | other *** search
/ EuroCD 3 / EuroCD 3.iso / Music / DigiBoosterPRO / sources / DBM0player.s
Encoding:
Text File  |  1998-06-24  |  75.4 KB  |  5,310 lines

  1. ;----------------- DIGI Booster PRO By Tap & Walt ----------------
  2. ;             player v 2.16 pure code                     ;
  3. ;             by Tap - Tomasz Piasta                      ;
  4. ;-----------------------------------------------------------------
  5. ;new in 2.16 
  6. ;added pannings and panning envelopes
  7. ;added DSP echo effect commands
  8. ;----------------------------------------------------------------- 
  9. ;You have to fill in following data:
  10. ;
  11. ;    ReadMemAdr - which is start adress of loaded module
  12. ;    ReadMemEnd - which is end adress of loaded module
  13. ;
  14. ;       to configurate DB player use:
  15. ;
  16. ;       AutoBoostEn - 0 - auto boost disabled
  17. ;                   - 1 - auto boost enabled (default)
  18. ;
  19. ;       MasterVol   - which is a master volume of all channels
  20. ;                     (use this parameter in volumeslider)
  21. ;
  22. ;       SongPos     - change song position
  23. ;       PattPos     - change current position in pattern
  24. ;
  25. ;       InstrNames - list of instrument's names (each takes 30 bytes)
  26. ;
  27. ;
  28. ;------------------------------------------------------------------
  29.  
  30.  
  31.     incdir    include:
  32.     include    lvo/exec_lib.i
  33.     include lvo/gadtools_lib.i
  34.     include    lvo/ahi_lib.i
  35.     include    devices/ahi.i
  36.     include    "utility/hooks.i"
  37.  
  38.  
  39. Open        equ    -30
  40. Close        equ     -36
  41. Read        equ    -42
  42. ModeRead    equ    1005
  43.  
  44. Lock        =-84
  45. UnLock        =-90
  46. Examine        =-102
  47. ExNext        =-108
  48. AccesRead    =-2
  49.  
  50. Write        equ -48
  51. ModeWrite    equ 1006    
  52.  
  53. s:
  54.     move.l    4.w,ExecBase
  55.  
  56.     move.l    4.w,a6
  57.     lea    DosName,a1
  58.     moveq    #0,d0
  59.     jsr    _LVOOpenLibrary(a6)
  60.     move.l    d0,DosBase
  61.  
  62.     move.l    4.w,a6
  63.     lea    ReqName,a1
  64.     moveq    #0,d0
  65.     jsr    _LVOOpenLibrary(a6)
  66.     move.l    d0,ReqBase
  67.  
  68.     move.l    #MODULE,ReadMemAdr
  69.     move.l    #ENDMODULE,ReadMemEnd
  70.  
  71.     lea    InstrGeneralPan,a1
  72.     move.l    #256-1,d7
  73. .setpan    move.w    #128,(a1)+
  74.     dbf    d7,.setpan
  75.  
  76.     move.l    ReadMemEnd,d0
  77.     sub.l    ReadMemAdr,d0
  78.     move.l    d0,FileLen
  79.     jsr    DBM0
  80.  
  81.     cmp.w    #1,LoadModError
  82.     beq.w    .WASERROR
  83.  
  84.     clr.w    SongPos
  85.     clr.w    PattPos
  86.     clr.w    FirstTrack
  87.     clr.w    PattPos
  88.     clr.b    count
  89.     moveq    #0,d0
  90.     move.w    GeneralSpeed,d0
  91.     move.b    d0,Orgtemp
  92.     bset    #1,$bfe001
  93.     move.b    Orgtemp,count
  94.     move.w    GeneralTempo,CiaTempo
  95.  
  96.     clr.w    PauseVBL
  97.     clr.b    PauseEn
  98.  
  99.     clr.b    count
  100.     clr.b    count2
  101.     clr.w    PattPos
  102.     lea    channel1,a0
  103.     move.w    #128-1,d7
  104. .clr    jsr    ClearSongData
  105.     lea    ChanArea(a0),a0
  106.     dbf    d7,.Clr
  107.  
  108. .retry
  109.  
  110.     jsr    ahi_initstart
  111.     tst.l    d0
  112.     beq.s    .ok
  113.     bsr    OpenAhiError
  114.     cmp.w    #1,d0
  115.     beq.s    .retry
  116.     clr.l    AhiBase
  117.     bra    .end
  118. .ok
  119.     move.b    #6,Temp
  120. .Loop:
  121.     move.l    DosBase,a6
  122.     moveq    #1,d1
  123.     jsr    -198(a6)
  124.     btst    #6,$bfe001
  125.     bne.s    .Loop
  126.  
  127.     jsr    Ahi_End
  128. .END
  129. .WASERROR
  130.     jsr    FreeModule
  131.     rts
  132.  
  133. DOSName:    dc.b    "dos.library",0
  134. reqname:    dc.b    'reqtools.library',0
  135.         even
  136. ExecBase:    dc.l    0
  137. DosBase:    dc.l    0
  138. ReqBase:    dc.l    0
  139. ReadName:    dc.l    0
  140.  
  141. GeneralTempo:    dc.w    125
  142. GeneralSpeed:    dc.w    6
  143. InstrNum:    dc.w    1
  144. FirstTrack:    dc.w    0
  145. ActualTrack:    dc.w    0
  146. TrackNumber:    dc.w    0
  147.  
  148. INSNUM:        dc.w    0
  149. PATNUM:        dc.w    0
  150. SNGNUM:        dc.w    0
  151. SMPNUM:        dc.w    0
  152.  
  153. OrdNum:        dc.w    0
  154.  
  155. OrdNum0:    dc.w    0
  156. OrdNum1:    dc.w    0
  157. OrdNum2:    dc.w    0
  158. OrdNum3:    dc.w    0
  159. OrdNum4:    dc.w    0
  160.  
  161. ActualSong:    dc.w    1
  162.  
  163. FileHandle:    dc.l    0
  164. LoadModError:    dc.w    0
  165. Mode16BitEn:    dc.w    0
  166.  
  167. PP_LENG:    dc.w    0
  168. PP_ADR:        dc.l    0
  169.  
  170. NoLoopEnable:    dc.w    0
  171. MIXITENABLE:    dc.w    0
  172.  
  173. playenable:    dc.w    0
  174. stopenable:    dc.w    0
  175.  
  176. OrgTemp:    dc.b    0
  177. SPAHIENABLE    dc.b    0
  178. PlayPattEn:    dc.w    0
  179. OldSPos:    dc.w    0
  180. EditEnable:    dc.w    0
  181. ACTCHAN:    dc.w    0
  182.  
  183. AutoBoostEn:
  184.         dc.w    1
  185.         even
  186.  
  187. *-----------------------------------------------------------------------*
  188. ;
  189. ; Cleanup Routines
  190.  
  191. ClearSongData:
  192.     clr.w    MainPeriod(a0)
  193.     clr.w    Oldd0(a0)
  194.     clr.w    Oldd1(a0)
  195.     clr.w    Oldd2(a0)
  196.     clr.w    Oldd3(a0)
  197.     clr.w    Oldd4(a0)
  198.     clr.w    Oldd5(a0)
  199.     clr.w    Oldd6(a0)
  200.  
  201.     clr.b    loopsdataschanA(a0)
  202.     clr.b    loopsdataschanA+1(a0)
  203.     clr.w    loopsdataschanA+2(a0)
  204.  
  205.     clr.b    loopsdataschanB(a0)
  206.     clr.b    loopsdataschanB+1(a0)
  207.     clr.w    loopsdataschanB+2(a0)
  208.  
  209.     clr.b    RetraceCntA(a0)
  210.     clr.b    RetraceCntB(a0)
  211.  
  212.     clr.w    PauseVBL
  213.     clr.b    PauseEn
  214.  
  215.     clr.b    EqNewSamA(a0)
  216.     clr.b    EqNewSamB(a0)
  217.  
  218.     clr.w    OrgPeriod(a0)
  219.     clr.w    OrgPeriodARP(a0)
  220.  
  221.     clr.l    GlissandoDatasA(a0)
  222.     clr.w    GlissandoDatasA+4(a0)
  223.     clr.l    GlissandoDatasB(a0)
  224.     clr.w    GlissandoDatasB+4(a0)
  225.  
  226.  
  227.     clr.b    OffEnable(a0)
  228.     clr.w    OldMainVol(a0)
  229.     clr.l    OldPanPos(a0)
  230.     rts
  231.  
  232.     
  233. FreeModule:
  234.     lea    Channel1+OnOffChanA,a0
  235.     moveq    #128-1,d7
  236. .onoff    bclr    #0,(a0)
  237.     lea    ChanArea(a0),a0
  238.     dbf    d7,.onoff
  239.  
  240.     bsr    FreeSong
  241.     bsr    FreeSamples
  242.  
  243.     move.w    #64,MasterVol
  244.     rts
  245.  
  246. FreeSong:
  247.     move.l    #1024-1,d7
  248.     lea    PattAdresses,a5
  249.     lea    PattLens,a4
  250.     moveq    #0,d6
  251.     move.w    TrackNumber,d6
  252.     mulu    #6,d6
  253. FreePatts
  254.     move.l    4,a6
  255.  
  256.     moveq    #0,d5
  257.     move.w    (a4)+,d5
  258.     mulu    d6,d5
  259.     move.l    d5,d0
  260.  
  261.     move.l    (a5),a1        ;adres zajetej pamieci
  262.     tst.l    (a5)+
  263.     beq.s    FreePattsDone
  264.  
  265.     subq.l    #8,a1
  266.     addq.l    #8,d0
  267.     jsr    -210(a6)
  268.     clr.l    -4(a5)
  269. ;    clr.w    -2(a4)
  270.     dbf    d7,FreePatts
  271. FreePattsDone
  272.  
  273.  
  274.     lea    SongOrders,a1
  275.     move.l    #1024-1,d7
  276. MMMCLR1    clr.w    (a1)+
  277.     dbf    d7,MMMCLR1
  278.  
  279.     lea    SongOrders0,a1
  280.     move.l    #[1024+1-1]*5,d7
  281. MMMCLR11
  282.     clr.w    (a1)+
  283.     dbf    d7,MMMCLR11
  284.  
  285.     bsr    ClrModName
  286.  
  287.     lea    SongNameBuffer,a1
  288.     move.w    #42-1,d7
  289. MMMCLR6    clr.b    (a1)+
  290.     dbf    d7,MMMCLR6
  291.  
  292.     lea    SongNameBuffer0,a1
  293.     move.w    #44*5-1,d7
  294. MMMCLR66
  295.     clr.b    (a1)+
  296.     dbf    d7,MMMCLR66
  297.  
  298.     clr.w    PATNUM
  299.     clr.w    ORDNUM
  300.     clr.w    ORDNUM0
  301.     clr.w    ORDNUM1
  302.     clr.w    ORDNUM2
  303.     clr.w    ORDNUM3
  304.     clr.w    ORDNUM4
  305.     clr.w    ActualSong
  306.     move.w    #64,GlobalVol
  307.  
  308.     move.l    Ahi_freq,d7
  309.     lsl.l    #8,d7
  310.     divu    #500,d7
  311.     and.l    #$ffff,d7
  312.     mulu    #64,d7
  313.     lsr.l    #8,d7
  314.     move.l    d7,DSPECHODELAY
  315.  
  316.     move.l    #$8000,DSPECHOFEEDBACK
  317.     move.l    #$8000,DSPECHOMIX
  318.     move.l    #$10000,DSPECHOCROSS
  319.  
  320.  
  321.     lea    DSPParamTab,a1
  322.     move.w    #$40,(a1)
  323.     move.w    #$80,2(a1)
  324.     move.w    #$80,4(a1)
  325.     move.w    #$ff,6(a1)
  326.  
  327.     move.w    #125,RealTempo
  328.     move.w    #125,RealCiaTempo
  329.  
  330.     lea    mask1channels+2,a1
  331.     move.w    #128-1,d7
  332. .clr    move.b    #AHIEDM_DRY,(a1)+
  333.     dbf    d7,.clr
  334.  
  335.     clr.w    FirstTrack
  336.     rts
  337.  
  338.  
  339. ClrModName:
  340.     lea    ModNameBuffer,a1
  341.     move.w    #42-1,d7
  342. MMMCLR4    clr.b    (a1)+
  343.     dbf    d7,MMMCLR4
  344.     rts
  345.  
  346.  
  347.  
  348. FreeSamples:
  349.     move.l    #255-1,d7
  350.     lea    AHI_Samples,a5
  351. FreeSampleLoop
  352.     move.l    4,a6
  353.     move.l    (a5),a1            ;adres zajetej pamieci
  354.     move.l    4(a5),d0
  355.  
  356.     clr.l    8(a5)
  357.     clr.l    12(a5)
  358.     clr.l    4(a5)
  359.  
  360.     tst.l    (a5)
  361.     beq.s    FreeSamMKL
  362.  
  363.     cmp.l    #0,Ahi_Sound0
  364.     beq.s    .8bit
  365.     add.l    d0,d0
  366. .8bit
  367.  
  368.     clr.l    (a5)
  369.     subq.l    #8,a1
  370.     addq.l    #8,d0
  371.     jsr    -210(a6)
  372. FreeSamMKL
  373.     lea    16(a5),a5
  374.     dbf    d7,FreeSampleLoop
  375.  
  376.     lea    SamVol,a1
  377.     move.l    #256-1,d7
  378. MMMCLR2    clr.b    (a1)+
  379.     dbf    d7,MMMCLR2
  380.  
  381.     lea    samfin,a1
  382.     move.l    #256-1,d7
  383. MMMCLR3    move.l    #8363,(a1)+
  384.     dbf    d7,MMMCLR3
  385.  
  386.     lea    InstrNames,a1
  387.     move.l    #30*256/4-1,d7
  388. MMMCLR5    clr.l    (a1)+
  389.     dbf    d7,MMMCLR5
  390.  
  391.     lea    VolEnvelope,a1
  392.     move.l    #134*256/4-1,d7
  393. MMMCLR7    clr.l    (a1)+
  394.     dbf    d7,MMMCLR7
  395.  
  396.     lea    PanEnvelope,a1
  397.     move.l    #134*256/4-1,d7
  398. .MMMCLR7p
  399.     clr.l    (a1)+
  400.     dbf    d7,.MMMCLR7p
  401.  
  402.     lea    SampleType,a1
  403.     move.l    #256*2-1,d7
  404. MMMCLR8    clr.b    (a1)+
  405.     dbf    d7,MMMCLR8
  406.  
  407.     lea    LoopTab,a1
  408.     move.l    #256-1,d7
  409. MMMCLR9    clr.b    (a1)+
  410.     dbf    d7,MMMCLR9
  411.  
  412.     lea    InstrGeneralPan,a1
  413.     move.l    #256-1,d7
  414. MMMCLRA move.w    #128,(a1)+
  415.     dbf    d7,MMMCLRA
  416.  
  417.     bsr    makeinstr
  418.  
  419.     move.w    #125,RealTempo
  420.     move.w    #125,RealCiaTempo
  421.  
  422.     clr.w    INSNUM
  423.     move.w    #64,GlobalVol
  424.  
  425.     tst.w    CANDO
  426.     beq.s    CANTDO
  427.     move.l    #AHIST_M8S,AHI_Sound0
  428.     clr.w    Mode16biten
  429. CANTDO
  430.     rts
  431.  
  432. CANDO:    dc.w    0
  433.  
  434. MakeInstr:
  435.     lea    Instruments,a0
  436.     move.l    #256-1,d7
  437.     moveq    #0,d0
  438. .mi
  439.     move.w    d0,(a0)+
  440.     addq    #1,d0
  441.     dbf    d7,.mi
  442.     rts
  443.  
  444.  
  445. DSPParamTab:
  446.     dc.w    0,0,0,0
  447.  
  448. UpdateEffects:
  449.     lea    DSPParamTab,a0
  450.     moveq    #0,d3
  451.     move.w    (a0),d3
  452.     add.w    #$2000,d3
  453.     jsr    SetDelay
  454.  
  455.     lea    DSPParamTab,a0
  456.     moveq    #0,d3
  457.     move.w    2(a0),d3
  458.     add.w    #$2100,d3
  459.     jsr    SetFeedBack
  460.  
  461.     lea    DSPParamTab,a0
  462.     moveq    #0,d3
  463.     move.w    4(a0),d3
  464.     add.w    #$2200,d3
  465.     jsr    SetMix
  466.  
  467.     lea    DSPParamTab,a0
  468.     moveq    #0,d3
  469.     move.w    6(a0),d3
  470.     add.w    #$2300,d3
  471.     jsr    SetCross
  472.  
  473.     bsr    EchoOn
  474.     rts
  475.  
  476. ChooseReqTitle:
  477.     dc.b    "Digi Booster 2.12 player Request",0
  478.     even
  479.  
  480. RT_TagBase        equ    $80000000
  481. RTEZ_ReqTitle        equ     (RT_TagBase+20)
  482. RTEZ_DefaultResponse    equ     (RT_TagBase+23)
  483. RT_Underscore        equ     (RT_TagBase+11)
  484. RT_ReqPos        equ     (RT_TagBase+3)
  485. REQPOS_CENTERSCR    equ     2
  486. rtEZRequestA        equ    -66
  487.  
  488. ChooseReqTags:
  489.     dc.l    RTEZ_ReqTitle,ChooseReqTitle
  490.     dc.l    RTEZ_DefaultResponse,1
  491.     dc.l    RT_Underscore,'_'
  492.     dc.l    RT_ReqPos,REQPOS_CENTERSCR
  493.     dc.l    0,0
  494.  
  495. OpenChooseReq:
  496.     move.l    ReqBase,a6
  497.     lea    ChooseReqTags,a0
  498.     move.l    #0,a3
  499.     move.l    #0,a4
  500.     jsr    rtEZRequestA(a6)
  501.     rts
  502.  
  503. NotEnoughMemoryError
  504.     movem.l    d0-a6,-(sp)
  505.     move.l    #NoMemoryText,a1
  506.     move.l    #AboutOKText,a2
  507.     bsr    OpenChooseReq
  508.     movem.l    (sp)+,d0-a6
  509.     rts
  510.  
  511. NotEnoughForConvert
  512.     movem.l    d0-a6,-(sp)
  513.     move.l    #NoMemForConvert,a1
  514.     move.l    #AboutOKText,a2
  515.     bsr    OpenChooseReq
  516.     movem.l    (sp)+,d0-a6
  517.     rts
  518.  
  519. ReadError:
  520.     movem.l    d0-a6,-(sp)
  521.     move.l    #ReadErrorText,a1
  522.     move.l    #AboutOKText,a2
  523.     bsr    OpenChooseReq
  524.     movem.l    (sp)+,d0-a6
  525.     rts
  526.  
  527.  
  528. OpenAhiError:
  529.     movem.l    d1-a6,-(sp)
  530.     move.l    #OpenAhiErrorText,a1
  531.     move.l    #OpenAhiErrorAskText,a2
  532.     bsr    OpenChooseReq
  533.     movem.l    (sp)+,d1-a6
  534.     rts
  535.  
  536. OpenAhiError2:
  537.     movem.l    d1-a6,-(sp)
  538.     move.l    #OpenAhiErrorText2,a1
  539.     move.l    #AboutOKText,a2
  540.     bsr    OpenChooseReq
  541.     movem.l    (sp)+,d1-a6
  542.     rts
  543.  
  544.  
  545.  
  546. ReadErrorTEXT:
  547.     dc.b    " Read Error! ",10
  548.     dc.b    0
  549.     even
  550.  
  551. NoMemForConvert:
  552.     dc.b    "Sorry! There is no memory to",10
  553.     dc.b    "convert samples to 16 bit!!!",10
  554.     dc.b    0
  555.     even
  556.  
  557. NoMemoryTEXT:
  558.     dc.b    " Not Enough Memory! ",10
  559.     dc.b    0
  560.     even
  561.  
  562. OpenAhiErrorTEXT:
  563.     dc.b    " Can't open AHI.device !",10
  564.     dc.b    0
  565.     even
  566.  
  567. OpenAhiErrorTEXT2:
  568.     dc.b    " Can't open AHI.device !",10
  569.     dc.b    "       Try again.",10
  570.     dc.b    0
  571.     even
  572.  
  573. OpenAhiErrorASKTEXT:
  574.     dc.b    "_Retry |_Cancel",0
  575.     even
  576.  
  577. AboutOKText:
  578.     dc.b    "_OK",0
  579.     even
  580.  
  581.  
  582.  
  583. ConvertAllTo16BIT:
  584.     movem.l    d0-a6,-(sp)
  585.     cmp.l    #0,Ahi_Sound0
  586.     beq.s    .no16bitmode
  587.  
  588.     move.w    #0,Mode16biten
  589.     move.l    #0,Ahi_Sound0
  590. ;    jsr    FreeSampleBuffer
  591.     move.w    #1,Mode16biten
  592.     move.l    #1,Ahi_Sound0
  593.  
  594.  
  595.     move.l    #255-1,d6
  596.     moveq    #0,d7
  597. .loop
  598.     movem.l    d0-d6/a0-a6,-(sp)
  599.     bsr    ConvertTO16BIT
  600.     movem.l    (sp)+,d0-d6/a0-a6
  601.  
  602.     cmp.w    #-1,d7
  603.     beq.s    NotMem
  604.  
  605.     dbf    d6,.loop
  606.  
  607. .no16bitmode
  608.     movem.l    (sp)+,d0-a6
  609.     rts
  610.  
  611. NotMem:
  612.     jsr    NotEnoughForConvert
  613.  
  614. ;    move.w    #0,Mode16BitEn
  615. ;    move.l    #AHIST_M8S,AHI_Sound0
  616. ;    jsr    ConvertAllTO8bit
  617.  
  618.     movem.l    (sp)+,d0-a6
  619.     rts
  620.  
  621. ConvertTO16BIT:
  622.     lea    SampleType,a6
  623.     tst.b    (a6,d6.w)
  624.     bne.s    .juzjest16bit
  625.     move.b    #1,(a6,d6.w)
  626.     move.l    d6,d7
  627.     lsl.w    #4,d7
  628.     lea    AHI_Samples,a5
  629.     move.l    4(a5,d7.w),d0
  630.     tst.l    d0
  631.     beq.s    .juzjest16bit
  632.  
  633.     movem.l    d1-a6,-(sp)
  634.     move.l    4,a6
  635.     add.l    d0,d0
  636.     addq.l    #8,d0
  637.     move.l    #$10001,d1
  638.     jsr    -198(a6)
  639.     movem.l    (sp)+,d1-a6
  640.     tst.l    d0
  641.     beq    .allocerror
  642.     addq.l    #8,d0
  643.  
  644.     movem.l    d0-a6,-(sp)
  645.     move.l    (a5,d7.w),a2
  646.     move.l    d0,a3
  647.     move.l    4(a5,d7.w),d6
  648. .expandto16
  649.     move.b    (a2)+,(a3)+
  650.     clr.b    (a3)+
  651.     subq.l    #1,d6
  652.     tst.l    d6
  653.     bgt.s    .expandto16
  654.     movem.l    (sp)+,d0-a6
  655.  
  656.     movem.l    d0-a6,-(sp)
  657.     move.l    (a5,d7.w),a1
  658.     move.l    4(a5,d7.w),d0
  659.     subq.l    #8,a1
  660.     addq.l    #8,d0
  661.     move.l    4,a6
  662.     jsr    -210(a6)
  663.     movem.l    (sp)+,d0-a6
  664.  
  665.     move.l    d0,(a5,d7.w)
  666.  
  667. .juzjest16bit
  668.     moveq    #0,d7
  669.     rts
  670.  
  671. .allocerror
  672.     clr.b    (a6,d6.w)
  673.     moveq    #-1,d7
  674.     rts
  675.  
  676.  
  677.  
  678. ; ------------------------- read DBM0
  679. DBM0:
  680.     clr.w    DBM0_DONE1
  681.     clr.w    DBM0_DONE2
  682.     clr.l    DBM0_len
  683.  
  684.     lea    MODBUFFER,a5
  685.     move.l    a5,d2
  686.     move.l    #8,d3
  687.     jsr    ReadMem
  688.     cmp.l    #-1,d0
  689.     beq.w    RM_ReadError
  690.  
  691. ; ----------- read hunks
  692. .mainloop
  693.     move.l    a5,d2
  694.     move.l    #8,d3
  695.     add.l    d3,DBM0_len
  696.     jsr    ReadMem
  697.     cmp.l    #-1,d0
  698.     beq.w    DBM0_ReadError
  699.  
  700.     lea    Headers,a0
  701. .loop
  702.     move.l    (a0)+,d0
  703.     move.l    (a0)+,a1
  704.  
  705.     cmp.l    #-1,d0
  706.     beq.s    .notfound
  707.     cmp.l    (a5),d0
  708.     bne.s    .loop
  709.     addq.w    #1,DBM0_DONE1
  710.  
  711.     move.l    4(a5),d7
  712.     add.l    d7,DBM0_len
  713.  
  714.     jsr    (a1)
  715.     cmp.w    #0,LoadModError
  716.     bne.s    .done
  717.     cmp.w    #9,DBM0_DONE1
  718.     beq.w    .done
  719.     bra.s    .mainloop
  720.  
  721. .notfound
  722.     move.l    4(a5),d3
  723.     add.l    d3,DBM0_len
  724.  
  725.     move.l    DBM0_len,d7
  726.     cmp.l    FileLen,d7
  727.     bge.s    .done
  728.  
  729.     tst.l    d3
  730.     beq.s    .zero
  731.  
  732.     move.l    filehandle,d1
  733.     move.l    a5,d2
  734.     jsr    ReadMem
  735.     cmp.l    #-1,d0
  736.     beq.w    DBM0_ReadError
  737. .zero
  738.     addq.w    #1,DBM0_DONE2
  739.     cmp.w    #10,DBM0_DONE2
  740.     beq.s    .done
  741.     bra.w    .mainloop
  742.  
  743. .done
  744.     movem.l    d0-a6,-(sp)
  745.     bsr    ConvertAllTo16BIT
  746.     movem.l    (sp)+,d0-a6
  747.     rts
  748.  
  749.  
  750. HEADERS:
  751.     dc.b    "NAME"
  752.     dc.l    DBM0_ReadName
  753.  
  754.     dc.b    "INFO"
  755.     dc.l    DBM0_ReadInfo
  756.  
  757.     dc.b    "SONG"
  758.     dc.l    DBM0_ReadSong
  759.  
  760.     dc.b    "INST"
  761.     dc.l    DBM0_ReadInst
  762.  
  763.     dc.b    "PATT"
  764.     dc.l    DBM0_ReadPatt
  765.  
  766.     dc.b    "SMPL"
  767.     dc.l    DBM0_ReadSmpl
  768.  
  769.     dc.b    "VENV"
  770.     dc.l    DBM0_ReadVenv
  771.  
  772.     dc.b    "PENV"
  773.     dc.l    DBM0_ReadPenv
  774.  
  775.     dc.b    "DSPE"
  776.     dc.l    DBM0_ReadDSPecho
  777.     dc.l    -1
  778.  
  779. DBM0_DONE1:
  780.     dc.w    0
  781. DBM0_DONE2:
  782.     dc.w    0
  783. DBM0_len:
  784.     dc.l    0
  785.  
  786. DBM0_ReadError:
  787.     moveq    #-1,d0
  788.     jsr    ReadError
  789.     move.w    #2,LoadModError
  790.     rts
  791.  
  792.  
  793. DBM0_ReadName:
  794.     move.l    filehandle,d1
  795.     move.l    a5,d2
  796.     move.l    4(a5),d3
  797.     jsr    ReadMem
  798.     cmp.l    #-1,d0
  799.     beq.w    DBM0_ReadError
  800.  
  801.     move.l    a5,a6
  802.     lea    ModNameBuffer,a4
  803.     moveq    #42-1,d7
  804. .copyname
  805.     move.b    (a6)+,(a4)+
  806.     dbf    d7,.copyname
  807.     moveq    #0,d0
  808.     rts
  809.  
  810. DBM0_ReadInfo:
  811.     move.l    filehandle,d1
  812.     move.l    a5,d2
  813.     move.l    4(a5),d3
  814.     jsr    ReadMem
  815.     cmp.l    #-1,d0
  816.     beq.w    DBM0_ReadError
  817.  
  818.     move.w    (a5),InsNum
  819.     move.w    2(a5),SmpNum
  820.     move.w    4(a5),SngNum
  821.     move.w    6(a5),PatNum
  822.     subq    #1,InsNum
  823.     subq    #1,SmpNum
  824.     subq    #1,SngNum
  825.     subq    #1,PatNum
  826.     clr.l    AHI_CHAN
  827.     move.w    8(a5),AHI_CHAN+2
  828.     move.w    8(a5),TrackNumber
  829.     moveq    #0,d0
  830.     rts
  831.  
  832.  
  833.  
  834.  
  835. DBM0_ReadSong:
  836.     move.l    a5,d2
  837.     move.l    #46,d3
  838.     jsr    ReadMem
  839.     cmp.l    #-1,d0
  840.     beq.w    DBM0_ReadError
  841.  
  842.     move.l    a5,a6
  843.     lea    SongNameBuffer,a4
  844.     moveq    #42-1,d7
  845. .copyname
  846.     move.b    (a6)+,(a4)+
  847.     dbf    d7,.copyname
  848.     moveq    #0,d0
  849.  
  850.     move.l    #SongOrders,d2
  851.     moveq    #0,d3
  852.     move.w    44(a5),d3
  853.     subq    #1,d3
  854.     move.w    d3,OrdNum
  855.     addq    #1,d3
  856.     add.w    d3,d3
  857.     jsr    ReadMem
  858.     cmp.l    #-1,d0
  859.     beq.w    DBM0_ReadError
  860.  
  861.     move.w    SngNum,d7
  862.     tst.w    d7
  863.     beq.w    .notmore
  864.     subq    #1,d7
  865.  
  866.  
  867.     lea    SongNameBuffer1,a2
  868.     lea    OrdNum1,a3
  869.     lea    SongOrders1,a4
  870. .more
  871.     move.l    a5,d2
  872.     move.l    #46,d3
  873.     jsr    ReadMem
  874.     cmp.l    #-1,d0
  875.     beq.w    DBM0_ReadError
  876.  
  877.     movem.l    d0-a6,-(sp)
  878.     move.l    a5,a6
  879.     lea    (a2),a4
  880.     moveq    #42-1,d6
  881. .copyname2
  882.     move.b    (a6)+,(a4)+
  883.     dbf    d6,.copyname2
  884.     movem.l    (sp)+,d0-a6
  885.  
  886.     move.l    a4,d2
  887.     moveq    #0,d3
  888.     move.w    44(a5),d3
  889.     subq    #1,d3
  890.     move.w    d3,(a3)
  891.     addq    #1,d3
  892.     add.w    d3,d3
  893.     jsr    ReadMem
  894.     cmp.l    #-1,d0
  895.     beq.w    DBM0_ReadError
  896.  
  897.     addq    #2,a3
  898.     add.l    #44,a2
  899.     add.l    #1025*2,a4
  900.  
  901.     dbf    d7,.more
  902. .notmore
  903.     moveq    #0,d0
  904.     rts
  905.  
  906.  
  907.  
  908.  
  909.  
  910. DBM0_ReadInst:
  911.     move.w    InsNum,d7
  912.     moveq    #0,d6
  913. .instloop
  914.     addq    #1,d6
  915.  
  916.     move.l    a5,d2
  917.     move.l    #50,d3
  918.     jsr    ReadMem
  919.     cmp.l    #-1,d0
  920.     beq.w    DBM0_ReadError
  921.  
  922.     lea    InstrNames,a6
  923.     move.l    d6,d5
  924.     mulu    #30,d5
  925.     add.w    d5,a6
  926.     moveq    #30-1,d4
  927.     lea    (a5),a4
  928. .copyname
  929.     move.b    (a4)+,(a6)+
  930.     dbf    d4,.copyname
  931.  
  932.     lea    Instruments,a6
  933.     move.l    d6,d5
  934.     add.w    d5,d5
  935.     move.w    30(a5),(a6,d5.w)
  936.  
  937.     lea    SamVol,a6
  938.     move.w    32(a5),d4
  939.     move.b    d4,-1(a6,d6.w)
  940.  
  941.     lea    SamFin,a6
  942.     move.l    d6,d5
  943.     lsl.w    #2,d5
  944.     move.l    34(a5),(a6,d5.w)
  945.  
  946.     lea    Ahi_Samples,a6
  947.     move.l    d6,d5
  948.     lsl.w    #4,d5
  949.     move.l    38(a5),8(a6,d5.w)
  950.     move.l    42(a5),12(a6,d5.w)
  951.  
  952.     lea    LoopTab,a6
  953.     move.l    46(a5),d5
  954.     move.b    d5,(a6,d6.w)
  955.  
  956.     dbf    d7,.instloop
  957.     moveq    #0,d0
  958.     rts
  959.  
  960.  
  961.  
  962.  
  963.  
  964.  
  965. DBM0_ReadVenv:
  966.     move.l    a5,d2
  967.     move.l    #2,d3
  968.     jsr    ReadMem
  969.     cmp.l    #-1,d0
  970.     beq.w    DBM0_ReadError
  971.  
  972.     move.w    (a5),d7
  973.     beq.s    .exit
  974.     subq    #1,d7
  975. .venvloop
  976.     move.l    a5,d2
  977.     move.l    #2,d3
  978.     jsr    ReadMem
  979.     cmp.l    #-1,d0
  980.     beq.w    DBM0_ReadError
  981.  
  982.     lea    VolEnvelope,a0
  983.     moveq    #0,d6
  984.     move.w    (a5),d6
  985.     subq    #1,d6
  986.     mulu    #134,d6
  987.     add.l    d6,a0
  988.     move.l    a0,d2
  989.  
  990.     move.l    #134,d3
  991.     jsr    ReadMem
  992.     cmp.l    #-1,d0
  993.     beq.w    DBM0_ReadError
  994.  
  995.     dbf    d7,.venvloop
  996. .exit
  997.     moveq    #0,d0
  998.     rts
  999.  
  1000.  
  1001.  
  1002.  
  1003. DBM0_ReadPenv:
  1004.     move.l    a5,d2
  1005.     move.l    #2,d3
  1006.     jsr    readmem
  1007.     cmp.l    #-1,d0
  1008.     beq.w    DBM0_ReadError
  1009.  
  1010.     move.w    (a5),d7
  1011.     beq.s    .exit
  1012.     subq    #1,d7
  1013. .penvloop
  1014.     move.l    a5,d2
  1015.     move.l    #2,d3
  1016.     jsr    readmem
  1017.     cmp.l    #-1,d0
  1018.     beq.w    DBM0_ReadError
  1019.  
  1020.     lea    PanEnvelope,a0
  1021.     moveq    #0,d6
  1022.     move.w    (a5),d6
  1023.     subq    #1,d6
  1024.     mulu    #134,d6
  1025.     add.l    d6,a0
  1026.     move.l    a0,d2
  1027.  
  1028.     move.l    #134,d3
  1029.     jsr    readmem
  1030.     cmp.l    #-1,d0
  1031.     beq.w    DBM0_ReadError
  1032.  
  1033.     dbf    d7,.penvloop
  1034. .exit
  1035.     moveq    #0,d0
  1036.     rts
  1037.  
  1038.  
  1039. DBM0_ReadDSPecho:
  1040.     move.l    a5,d2
  1041.     move.l    #2,d3
  1042.     jsr    readmem
  1043.     cmp.l    #-1,d0
  1044.     beq.w    DBM0_ReadError
  1045.  
  1046.  
  1047.     move.w    (a5),mask1channels
  1048.     moveq    #0,d3
  1049.     move.w    (a5),d3
  1050.  
  1051.     move.l    #mask1channels+2,d2
  1052.     jsr    readmem
  1053.     cmp.l    #-1,d0
  1054.     beq.w    DBM0_ReadError
  1055.  
  1056.     move.l    #DSPparamtab,d2
  1057.     move.l    #8,d3
  1058.     jsr    readmem
  1059.     cmp.l    #-1,d0
  1060.     beq.w    DBM0_ReadError
  1061.  
  1062.     rts
  1063.  
  1064.  
  1065.  
  1066. DBM0_ReadPatt:
  1067.     move.l    4.w,a6
  1068.     moveq    #0,d0
  1069.     move.w    TrackNumber,d0
  1070.     mulu    #8,d0
  1071.     mulu    #256,d0
  1072.     addq.l    #8,d0
  1073.     move.l    #$10001,d1
  1074.     jsr    -198(a6)
  1075.     tst.l    d0
  1076.     beq    DBM0_ReadError
  1077.     addq.l    #8,d0
  1078.     move.l    d0,PP_ADR
  1079.  
  1080.  
  1081.     lea    PATTLENS,a3
  1082.     lea    PATTAdresses,a4
  1083.  
  1084.     moveq    #0,d5
  1085.     move.w    PATNUM,d5
  1086. .onepatt
  1087.     move.l    a5,d2
  1088.     move.l    #6,d3
  1089.     jsr    ReadMem
  1090.     cmp.l    #-1,d0
  1091.     beq.w    DBM0_ReadError
  1092.  
  1093.  
  1094.     moveq    #0,d0
  1095.     move.w    (a5),d0
  1096. ;    addq    #1,d0
  1097.     move.w    d0,(a3)+
  1098.     moveq    #0,d1
  1099.     move.w    TrackNumber,d1
  1100.     mulu    #6,d1
  1101.     mulu    d0,d1
  1102.     move.l    d0,d6
  1103.  
  1104. ; ----------- alloc do rozpakowanego
  1105.     move.l    4,a6
  1106.     move.l    d1,d0
  1107.     addq.l    #8,d0
  1108.     move.l    #$10001,d1
  1109.     jsr    -198(a6)
  1110.     tst.l    d0
  1111.     beq    RM_AllocError
  1112.     addq.l    #8,d0
  1113.     move.l    d0,(a4)+
  1114.  
  1115.  
  1116.     move.l    PP_ADR,d2
  1117.     move.l    2(a5),d3
  1118.     jsr    ReadMem
  1119.     cmp.l    #-1,d0
  1120.     beq.w    DBM0_ReadError
  1121.  
  1122.     movem.l    d0-a6,-(sp)
  1123.     move.l    PP_ADR,a0
  1124.     move.l    -4(a4),a2
  1125.     moveq    #0,d4
  1126.     moveq    #0,d5
  1127.     move.w    TrackNumber,d4        ; tracks
  1128.     move.w    -2(a3),d5        ; rows
  1129.     subq    #1,d5
  1130.     bsr    DEPACKPATT
  1131.     movem.l    (sp)+,d0-a6
  1132.  
  1133.     dbf    d5,.onepatt
  1134.  
  1135.  
  1136.     move.l    4.w,a6
  1137.  
  1138.     moveq    #0,d0
  1139.     move.w    TrackNumber,d0
  1140.     mulu    #8,d0
  1141.     mulu    #256,d0
  1142.  
  1143.     move.l    PP_ADR,a1        ;adres zajetej pamieci
  1144.     subq.l    #8,a1
  1145.     addq.l    #8,d0
  1146.     jsr    -210(a6)
  1147.  
  1148.  
  1149.  
  1150.     moveq    #0,d0
  1151.     rts
  1152.  
  1153.  
  1154.  
  1155.  
  1156. DBM0_ReadSmpl:
  1157.     move.w    SmpNum,d7
  1158.     moveq    #0,d6
  1159.  
  1160. .readsample
  1161.     move.l    a5,d2
  1162.     move.l    #8,d3
  1163.     jsr    ReadMem
  1164.     cmp.l    #-1,d0
  1165.     beq.w    DBM0_ReadError
  1166.  
  1167.     addq    #1,d6
  1168.     move.l    4(a5),d3
  1169.     tst.l    d3
  1170.     beq.w    .doloop
  1171.  
  1172.     move.l    (a5),d0
  1173.  
  1174.  
  1175.     btst    #0,d0
  1176.     bne.s    .8bit
  1177.  
  1178.     add.l    d3,d3
  1179.     lea    SampleType,a6
  1180.     move.b    #1,(a6,d6.w)
  1181.     lea    256(a6),a6
  1182.     move.b    #1,(a6,d6.w)
  1183.     move.l    #AHIST_M16S,AHI_Sound0
  1184.     move.w    #1,Mode16BitEn
  1185. .8bit
  1186.  
  1187.  
  1188.     move.l    d3,d0
  1189.     addq.l    #8,d0
  1190.     move.l    #$10001,d1
  1191.     move.l    4,a6
  1192.     jsr    -198(a6)
  1193.     tst.l    d0
  1194.     beq    RM_AllocErrorDBM0SAM
  1195.     addq.l    #8,d0
  1196.  
  1197.     move.l    d6,d5
  1198.     lsl.w    #4,d5
  1199.  
  1200.     lea    Ahi_samples,a6
  1201.     tst.l    4(a5)
  1202.     beq.s    .qw
  1203.     move.l    d0,(a6,d5.w)
  1204. .qw
  1205.     move.l    4(a5),4(a6,d5.w)
  1206. **
  1207.  
  1208.     move.l    d0,d2
  1209.     jsr    ReadMem
  1210.     cmp.l    #-1,d0
  1211.     beq.w    DBM0_ReadError
  1212. .doloop
  1213.     dbf    d7,.readsample
  1214.  
  1215.  
  1216.  
  1217.     moveq    #0,d0
  1218.     rts
  1219.  
  1220.  
  1221.  
  1222.  
  1223. DEPACKPATT:
  1224.     mulu    #6,d4
  1225.     moveq    #0,d2
  1226.     moveq    #0,d3
  1227. .depackloop
  1228.     moveq    #0,d0
  1229.     move.b    (a0)+,d0
  1230.     tst.b    d0
  1231.     beq.w    .NextPos
  1232.  
  1233.     subq    #1,d0
  1234.     mulu    #6,d0
  1235.     add.l    d3,d0
  1236.  
  1237.     moveq    #0,d1
  1238.     move.b    (a0)+,d1
  1239.  
  1240.     btst    #0,d1
  1241.     beq.s    .notakenuta
  1242.     move.b    (a0)+,0(a2,d0.l)
  1243. .notakenuta
  1244.     btst    #1,d1
  1245.     beq.s    .notakenum
  1246.     move.b    (a0)+,1(a2,d0.l)
  1247. .notakenum
  1248.     btst    #2,d1
  1249.     beq.s    .notakeeffcom1
  1250.     move.b    (a0)+,2(a2,d0.l)
  1251. .notakeeffcom1
  1252.     btst    #3,d1
  1253.     beq.s    .notakeeffpar1
  1254.     move.b    (a0)+,3(a2,d0.l)
  1255. .notakeeffpar1
  1256.     btst    #4,d1
  1257.     beq.s    .notakeeffcom2
  1258.     move.b    (a0)+,4(a2,d0.l)
  1259. .notakeeffcom2
  1260.     btst    #5,d1
  1261.     beq.s    .notakeeffpar2
  1262.     move.b    (a0)+,5(a2,d0.l)
  1263. .notakeeffpar2
  1264.     bra.s    .depackloop
  1265.  
  1266. .NextPos:
  1267.     addq    #1,d2
  1268.     move.l    d2,d3
  1269.     mulu    d4,d3
  1270.  
  1271.     cmp.w    d2,d5
  1272.     bge.s    .depackloop
  1273.     rts
  1274.  
  1275. ReadMemAdr:    dc.l    0
  1276. ReadMemEnd:    dc.l    0
  1277. FileLen:    dc.l    0
  1278.  
  1279. ReadMem:
  1280.     movem.l    d0-a6,-(sp)
  1281.     move.l    d2,a0
  1282.     move.l    ReadMemAdr,a1
  1283. .loop
  1284.     cmp.l    ReadMemEnd,a1
  1285.     bge.s    .EndOfFile
  1286.  
  1287.     move.b    (a1)+,(a0)+
  1288.     subq.l    #1,d3
  1289.     tst.l    d3
  1290.     bne.s    .loop
  1291.  
  1292.     move.l    a1,ReadMemAdr
  1293.  
  1294.     movem.l    (sp)+,d0-a6
  1295.     moveq    #0,d0
  1296.     rts
  1297.  
  1298. .EndOfFile
  1299.     move.l    a1,ReadMemAdr
  1300.  
  1301.     movem.l    (sp)+,d0-a6
  1302.     moveq    #0,d0
  1303.     rts
  1304.  
  1305. ; -------------------------------------------------------
  1306.  
  1307. RM_ReadError:
  1308.     moveq    #0,d7
  1309.     move.w    #1,LoadModError
  1310.     jsr    ReadError
  1311.     rts
  1312.  
  1313. RM_AllocErrorDBM0SAM
  1314.     moveq    #0,d7
  1315.     move.w    #1,LoadModError
  1316.     jsr    NotEnoughMemoryError
  1317.     move.l    #AHIST_M8S,AHI_Sound0
  1318.     move.w    #0,Mode16BitEn
  1319.     rts
  1320.  
  1321. RM_AllocError:
  1322.     moveq    #0,d7
  1323.     move.w    #1,LoadModError
  1324.     jsr    NotEnoughMemoryError
  1325.     rts
  1326.  
  1327. RM_AllocSamError:
  1328.     clr.l    (a4)
  1329.     clr.l    4(a4)
  1330.     clr.l    8(a4)
  1331.     clr.l    12(a4)
  1332.     moveq    #0,d7
  1333.     move.w    #1,LoadModError
  1334.     jsr    NotEnoughMemoryError
  1335.     rts
  1336.  
  1337.  
  1338. ChanArea    equ    118
  1339.  
  1340. VolA:        equ    0    ; 2
  1341. SlideVolOldA    equ    2    ; 1
  1342. OldGlobalVolA    equ    3    ; 1
  1343.  
  1344. VolB:        equ    4    ; 2
  1345. SlideVolOldB    equ    6    ; 1
  1346. OldGlobalVolB    equ    7    ; 1
  1347.  
  1348. OLDVolA:    equ    8    ; 2
  1349. OLDVolB:    equ    10    ; 2
  1350. SlideSamOffset    equ    12    ; 2
  1351. OldSlideOffsetA    equ    14    ; 1
  1352. OldSlideOffsetB    equ    15    ; 1
  1353. MainVol:    equ    16    ; 2
  1354.  
  1355. ;ReplaceEnable    equ    18    ; 1
  1356.  
  1357. OFFenable    equ    19    ; 1
  1358. SamOffsetA    equ    20    ; 1
  1359. SamOffsetB    equ    21    ; 1
  1360. RetraceCntA    equ    22    ; 1
  1361. RetraceCntB    equ    23    ; 1
  1362. OldInstrNumA:    equ    24    ; 1
  1363. OldInstrNumB:    equ    25    ; 1
  1364.  
  1365. OrgPeriod    equ    26    ; 2
  1366. MainPeriod:    equ    28    ; 2
  1367. OldPeriod:    equ    30    ; 2
  1368. OrgPeriodARP    equ    32    ; 2
  1369. Oldd0        equ    34    ; 2
  1370. Oldd1        equ    36    ; 2
  1371. Oldd2        equ    38    ; 2
  1372. Oldd3        equ    40    ; 2
  1373. Oldd4        equ    42    ; 2
  1374. Oldd5        equ    44    ; 2
  1375. Oldd6        equ    46    ; 2
  1376. loopsdataschanA    equ    48    ; 4
  1377. loopsdataschanB    equ    52    ; 4
  1378.  
  1379. EqNewSamA    equ    56    ; 1
  1380. EqNewSamB    equ    57    ; 1
  1381.  
  1382. VolEnvTime    equ    58    ; 2
  1383. VolEnvOff    equ    60    ; 1
  1384. VolEnvMode    equ    61    ; 1
  1385.  
  1386. PortUpOldValA    equ    62    ; 1
  1387. PortUpOldValB    equ    63    ; 1
  1388. PortDownOldValA    equ    64    ; 1
  1389. PortDownOldValB    equ    65    ; 1
  1390. VibratoDatasA    equ    66    ; 4
  1391. VibratoDatasB    equ    70    ; 4
  1392. GlissandoDatasA    equ    74    ; 6
  1393. GlissandoDatasB    equ    80    ; 6
  1394.  
  1395. NoteDelayPeriodA    equ    86    ; 2
  1396. NoteDelayInstrNumA    equ    88    ; 2
  1397. NoteDelayPeriodB    equ    90    ; 2
  1398. NoteDelayInstrNumB    equ    92    ; 2
  1399.  
  1400. PanPos        equ    94    ; 4        ; it is a calculated panning
  1401.  
  1402. OnOffChanA    equ    98    ; 1
  1403. OnOffChanB    equ    99    ; 1
  1404.  
  1405. PanEnvTime    equ    100    ; 2
  1406. PanEnvOff    equ    102    ; 1
  1407. PanEnvMode    equ    103    ; 1
  1408.  
  1409. GeneralPan    equ    104    ; 2        ; it is a default pan 
  1410.                         ; changeable by 8xx e8x and
  1411.                         ; general pan parameter in pan env
  1412.                         ; range (0-256)
  1413.  
  1414. OldMainVol:    equ    106    ; 2
  1415. OldPanPos:    equ    108    ; 4
  1416.  
  1417. SlidePanOldA    equ    112    ; 1
  1418. SlidePanOldB    equ    113    ; 1
  1419.  
  1420. LastFreq    equ    114    ; 4
  1421. ;----------------------------------------------
  1422.  
  1423.  
  1424. ahibase:    dc.l    0
  1425. ahi_ctrl:    dc.l    0
  1426.  
  1427. ahi_ctrltags:
  1428.         dc.l    AHIC_Play,1
  1429.         dc.l    TAG_DONE
  1430. ahi_tags
  1431.         dc.l    AHIA_MixFreq
  1432. ahi_freq
  1433.         dc.l    32600
  1434.         dc.l    AHIA_Channels
  1435. ahi_chan:
  1436.         dc.l    8
  1437.         dc.l    AHIA_Sounds,1
  1438.         dc.l    AHIA_AudioID
  1439. ahi_audioid
  1440.         dc.l    $00020002    ; 2 pan, 4 stereo, 6 mono   8 8bit pan
  1441.         dc.l    AHIA_SoundFunc,SoundFunc
  1442.         dc.l    AHIA_PlayerFunc,PlayerFunc
  1443.         dc.l    AHIA_PlayerFreq,50<<16
  1444.         dc.l    AHIA_MinPlayerFreq,(8*2/5)<<16
  1445.         dc.l    AHIA_MaxPlayerFreq,(600*2/5)<<16
  1446.         dc.l    TAG_DONE
  1447.  
  1448. ahi_sound0:
  1449.         dc.l    AHIST_M8S
  1450. ahi_sta    dc.l    0            ; start
  1451. ahi_len    dc.l    -1                ; len
  1452.  
  1453. AHI_VOLBOOST:
  1454.         dc.l    Ahiet_MasterVolume
  1455. AHIBoost
  1456.         dc.l    $10000
  1457.         dc.l    TAG_DONE
  1458.  
  1459.  
  1460. AHI_DSPEFF:
  1461.     dc.l    AHIET_DSPECHO    ; ahie_Effect
  1462.  
  1463. DSPECHODELAY
  1464.     dc.l    0        ; ahiede_Delay
  1465.  
  1466. DSPECHOFEEDBACK
  1467.     dc.l    $8000            ; ahiede_Feedback
  1468.  
  1469. DSPECHOMIX
  1470.     dc.l    $8000            ; ahiede_Mix
  1471.  
  1472. DSPECHOCROSS
  1473.     dc.l    $10000           ; ahiede_Cross
  1474.     dc.l    TAG_DONE
  1475.  
  1476.  
  1477.  
  1478.  
  1479. PlayerFunc:
  1480.         blk.b    MLN_SIZE
  1481.         dc.l    mmusic
  1482.         dc.l    0
  1483.         dc.l    0
  1484.  
  1485. SoundFunc:
  1486.         blk.b    MLN_SIZE
  1487.         dc.l    soundfunc2
  1488.         dc.l    0
  1489.         dc.l    0
  1490.  
  1491.  
  1492. ;in:
  1493. * a0        struct Hook *                  
  1494. * a1        struct AHISoundMessage *         
  1495. * a2        struct AHIAudioCtrl *           
  1496.  
  1497.  
  1498. soundfunc2:
  1499.     movem.l    d2-d4/a6,-(sp)
  1500.     moveq    #0,d0
  1501.     move.w    ahism_Channel(a1),d0
  1502.     lea    ahi_channels,a0
  1503.     lsl.w    #2,d0
  1504.     move.w    2(a0,d0.w),d1
  1505.     and.w    #$00ff,d1
  1506.     move.w    (a0,d0.w),d7
  1507.     lsl.l    #4,d1
  1508.  
  1509.  
  1510.     lea    ahi_samples,a0
  1511.     move.l    (a0,d1.w),d2            ;sample start
  1512.     cmp.l    #0,Ahi_Sound0
  1513.     beq.s    .no16bit_1
  1514.     lsr.l    #1,d2
  1515. .no16bit_1
  1516.  
  1517.     tst.w    NoLoopEnable
  1518.     beq.s    .noloop1
  1519.     moveq    #0,d3
  1520.     bra.s    .noloop2
  1521. .noloop1
  1522.  
  1523.     add.l    8(a0,d7.w),d2            ;repeat start
  1524.     move.l    12(a0,d7.w),d3            ;repeat length
  1525.  
  1526. .noloop2
  1527.  
  1528.     moveq    #0,d4                ;NOTE: AHISF_IMM *NOT* SET!!
  1529. ;----------------------------
  1530.     lea    LoopTab,a0
  1531.     move.w    d7,d1
  1532.     moveq    #0,d7
  1533.     lsr.w    #4,d1
  1534.     btst    #1,(a0,d1.w)
  1535.     beq.s    .nopingpong
  1536.     moveq    #0,d4
  1537.     lea    ahi_channels,a0
  1538.     move.b    2(a0,d0.w),d4
  1539.     subq.w    #1,d4
  1540.     muls    #-1,d4
  1541.     move.b    d4,2(a0,d0.w)
  1542.     moveq    #1,d7
  1543. .nopingpong
  1544. ;----------------------------
  1545.  
  1546.     lsr.l    #2,d0                ; chnnum
  1547.     moveq    #0,d1                ;sample bank
  1548.  
  1549.     tst.l    d3
  1550.     beq.w    .length_0
  1551.  
  1552.     tst.w    d7                ; gdy ping pong loop
  1553.     bne.w    .pingpongproc
  1554.  
  1555.     cmp.w    #32,d0                ; tylko dla 32 kanalow
  1556.     bgt.w    .length_ok
  1557.     cmp.l    #512,d3
  1558.     bge.w    .length_ok
  1559.  
  1560.     cmp.l    #0,Ahi_Sound0            ; gdy 16 bit to olewa i skacze do proc2
  1561.     bne.s    .16bitproc
  1562.  
  1563. .8bitproc:
  1564.     movem.l    d0-d1/d4-a2,-(sp)
  1565.  
  1566.     lea    SamBuff,a0
  1567.     mulu    #1024+[16],d0
  1568.     add.w    d0,a0
  1569.  
  1570.     cmp.l    (a0),d2
  1571.     bne.s    .notakedata
  1572.     cmp.l    4(a0),d3
  1573.     beq.s    .takedata
  1574. .notakedata
  1575.     move.l    d2,(a0)
  1576.     move.l    d3,4(a0)
  1577.  
  1578.     add.l    #16,a0
  1579.     move.l    d2,a1
  1580.     move.l    a0,d2
  1581.     move.l    d2,-8(a0)
  1582.  
  1583.     move.l    d3,d7
  1584.     move.l    #1024,d6
  1585.     divu    d7,d6
  1586.     and.l    #$ffff,d6
  1587.     move.l    d7,d3
  1588.     mulu    d6,d3
  1589.     move.l    d3,-4(a0)
  1590.  
  1591.     subq    #1,d6
  1592.     subq    #1,d7
  1593.     move.l    a1,d4
  1594.     move.l    d7,d5
  1595. .makebuffloopM
  1596.     move.l    d4,a1
  1597.     move.l    d5,d7
  1598. .makebuff
  1599.     move.b    (a1)+,(a0)+
  1600.     dbf    d7,.makebuff
  1601.     dbf    d6,.makebuffloopM
  1602.     bra.s    .makebuffdone
  1603. .takedata
  1604.     move.l    8(a0),d2
  1605.     move.l    12(a0),d3
  1606. .makebuffdone
  1607.     movem.l    (sp)+,d0-d1/d4-a2
  1608.     bra.w    .length_ok
  1609.  
  1610.  
  1611.  
  1612.  
  1613.  
  1614. .16bitproc:
  1615.     cmp.l    #512/2,d3
  1616.     bge.w    .length_ok
  1617.  
  1618.     movem.l    d0-d1/d4-a2,-(sp)
  1619.  
  1620.     lea    SamBuff,a0
  1621.     mulu    #1024+[16],d0
  1622.     add.w    d0,a0
  1623.  
  1624.     cmp.l    (a0),d2
  1625.     bne.s    .notakedata16
  1626.     cmp.l    4(a0),d3
  1627.     beq.s    .takedata16
  1628. .notakedata16
  1629.     move.l    d2,(a0)
  1630.     move.l    d3,4(a0)
  1631.  
  1632.     add.l    #16,a0
  1633.     move.l    d2,a1
  1634.     add.l    d2,a1
  1635.     move.l    a0,d2
  1636.     move.l    d2,-8(a0)
  1637.  
  1638.     move.l    d3,d7
  1639.     move.l    #1024/2,d6
  1640.     divu    d7,d6
  1641.     and.l    #$ffff,d6
  1642.     move.l    d7,d3
  1643.     mulu    d6,d3
  1644.     move.l    d3,-4(a0)
  1645.  
  1646.     subq    #1,d6
  1647.     subq    #1,d7
  1648.     move.l    a1,d4
  1649.     move.l    d7,d5
  1650. .makebuffloopM16
  1651.     move.l    d4,a1
  1652.     move.l    d5,d7
  1653. .makebuff16
  1654.     move.w    (a1)+,(a0)+
  1655.     dbf    d7,.makebuff16
  1656.     dbf    d6,.makebuffloopM16
  1657.     bra.s    .makebuffdone16
  1658. .takedata16
  1659.     move.l    8(a0),d2
  1660.     move.l    12(a0),d3
  1661. .makebuffdone16
  1662.     cmp.l    #0,Ahi_Sound0
  1663.     beq.s    .no16bit_2
  1664.     lsr.l    #1,d2
  1665. .no16bit_2
  1666.     movem.l    (sp)+,d0-d1/d4-a2
  1667.     bra.w    .length_ok
  1668.  
  1669.  
  1670.  
  1671.  
  1672.  
  1673. .pingpongproc:
  1674.     cmp.w    #32,d0                ; tylko dla 32 kanalow
  1675.     bgt.w    .length_ok
  1676.     cmp.l    #512/2,d3            ; ping pong musi miec parzyste
  1677.     bge.w    .length_ok
  1678.  
  1679.  
  1680.     cmp.l    #0,Ahi_Sound0            ; gdy 16 bit to olewa i skacze do proc2
  1681.     bne.w    .16bitprocpp
  1682.  
  1683.  
  1684. .8bitproc_pp:
  1685.     movem.l    d0-d1/d4-a2,-(sp)
  1686.  
  1687.     lea    SamBuff,a0
  1688.     mulu    #1024+[16],d0
  1689.     add.w    d0,a0
  1690.  
  1691.     cmp.l    (a0),d2
  1692.     bne.s    .notakedata_pp
  1693.     cmp.l    4(a0),d3
  1694.     beq.s    .takedata_pp
  1695. .notakedata_pp
  1696.     move.l    d2,(a0)
  1697.     move.l    d3,4(a0)
  1698.  
  1699.     add.l    #16,a0
  1700.     move.l    d2,a1
  1701.     move.l    a0,d2
  1702.     move.l    d2,-8(a0)
  1703.  
  1704.     move.l    d3,d7
  1705.     move.l    #1024,d6
  1706.     divu    d7,d6
  1707.     and.l    #$ffff,d6
  1708.     move.l    d7,d3
  1709.     mulu    d6,d3
  1710.     move.l    d3,-4(a0)
  1711.  
  1712.     lsr.l    #1,d6        ; dziele przez dwa ilosc petli bo jest ping pong
  1713.  
  1714.     subq    #1,d6
  1715.     subq    #1,d7
  1716.     move.l    a1,d4
  1717.     move.l    d7,d5
  1718. .makebuffloopM_pp
  1719.     move.l    d4,a1
  1720.     move.l    d5,d7
  1721. .makebuff_pp
  1722.     move.b    (a1)+,(a0)+
  1723.     dbf    d7,.makebuff_pp
  1724.  
  1725.  
  1726. ;    move.l    d4,a1
  1727.     move.l    d5,d7
  1728. .makebuff_pp2
  1729.     move.b    -(a1),(a0)+
  1730.     dbf    d7,.makebuff_pp2
  1731.  
  1732.  
  1733.     dbf    d6,.makebuffloopM_pp
  1734.     bra.s    .makebuffdone_pp
  1735. .takedata_pp
  1736.     move.l    8(a0),d2
  1737.     move.l    12(a0),d3
  1738. .makebuffdone_pp
  1739.     movem.l    (sp)+,d0-d1/d4-a2
  1740.  
  1741.     moveq    #0,d4
  1742.     bra.w    .length_ok
  1743.  
  1744.  
  1745.  
  1746.  
  1747.  
  1748.  
  1749.  
  1750. .16bitprocpp:
  1751.     cmp.l    #512/2/2,d3
  1752.     bge.w    .length_ok
  1753.  
  1754.     movem.l    d0-d1/d4-a2,-(sp)
  1755.  
  1756.     lea    SamBuff,a0
  1757.     mulu    #1024+[16],d0
  1758.     add.w    d0,a0
  1759.  
  1760.     cmp.l    (a0),d2
  1761.     bne.s    .notakedata16pp
  1762.     cmp.l    4(a0),d3
  1763.     beq.s    .takedata16pp
  1764. .notakedata16pp
  1765.     move.l    d2,(a0)
  1766.     move.l    d3,4(a0)
  1767.  
  1768.     add.l    #16,a0
  1769.     move.l    d2,a1
  1770.     add.l    d2,a1
  1771.     move.l    a0,d2
  1772.     move.l    d2,-8(a0)
  1773.  
  1774.     move.l    d3,d7
  1775.     move.l    #1024/2,d6
  1776.     divu    d7,d6
  1777.     and.l    #$ffff,d6
  1778.     move.l    d7,d3
  1779.     mulu    d6,d3
  1780.     move.l    d3,-4(a0)
  1781.  
  1782.     lsr.l    #1,d6        ; dziele przez dwa ilosc petli bo jest ping pong
  1783.  
  1784.     subq    #1,d6
  1785.     subq    #1,d7
  1786.     move.l    a1,d4
  1787.     move.l    d7,d5
  1788. .makebuffloopM16pp
  1789.  
  1790.  
  1791.     move.l    d4,a1
  1792.     move.l    d5,d7
  1793. .makebuff16pp
  1794.     move.w    (a1)+,(a0)+
  1795.     dbf    d7,.makebuff16pp
  1796.  
  1797. ;    move.l    d4,a1
  1798.     move.l    d5,d7
  1799. .makebuff16pp2
  1800.     move.w    -(a1),(a0)+
  1801.     dbf    d7,.makebuff16pp2
  1802.  
  1803.  
  1804.     dbf    d6,.makebuffloopM16pp
  1805.     bra.s    .makebuffdone16pp
  1806. .takedata16pp
  1807.     move.l    8(a0),d2
  1808.     move.l    12(a0),d3
  1809. .makebuffdone16pp
  1810.     cmp.l    #0,Ahi_Sound0
  1811.     beq.s    .no16bit_2pp
  1812.     lsr.l    #1,d2
  1813. .no16bit_2pp
  1814.     movem.l    (sp)+,d0-d1/d4-a2
  1815.  
  1816.     moveq    #0,d4
  1817.     bra.w    .length_ok
  1818.  
  1819.  
  1820.  
  1821.  
  1822.  
  1823. .length_0
  1824.     moveq    #AHI_NOSOUND,d1
  1825. .length_ok
  1826.  
  1827.     lea    SampleOffsets,a6
  1828.  
  1829.     cmp.l    #AHI_NOSOUND,d1
  1830.     bne.s    .nozero
  1831.     cmp.l    (a6,d0.w*4),d2
  1832.     beq.s    .nozero
  1833.  
  1834. ; --------------------------------------- ;
  1835.     lea    SampleOffsetsFT,a6
  1836.     tst.b    (a6,d0.w)
  1837.     beq.s    .okft1
  1838.     clr.b    (a6,d0.w)
  1839.     bra.s    .nozero
  1840. .okft1
  1841. ; ^-------------------------------------- ;
  1842.  
  1843.     lea    SampleOffsets,a6
  1844.     move.l    #0,(a6,d0.w*4)            ;start
  1845. .nozero
  1846.  
  1847.     cmp.l    #0,(a6,d0.w*4)    
  1848.     beq.s    .zero
  1849.  
  1850.     lea    SampleOffsetsFT,a6
  1851.     tst.b    (a6,d0.w)
  1852.     beq.s    .okft2
  1853.     clr.b    (a6,d0.w)
  1854.     bra.s    .zero
  1855. .okft2
  1856. ; ^-------------------------------------- ;
  1857.     lea    SampleOffsets,a6
  1858.     move.l    d2,(a6,d0.w*4)            ;start
  1859. .zero
  1860.  
  1861.  
  1862.     tst.b    d4
  1863.     beq.s    .nopingpong2
  1864.  
  1865.     subq.l    #1,d3
  1866.     add.l    d3,d2
  1867.     subq.l    #1,d2
  1868.     not.l    d3
  1869.     bra.s    .yapingpong
  1870. .nopingpong2
  1871.     tst.w    d7
  1872.     beq.s    .yapingpong
  1873.     cmp.l    #0,(a6,d0.w*4)    
  1874.     beq.s    .yapingpong
  1875.     add.l    d3,(a6,d0.w*4)            ;start
  1876. .yapingpong
  1877.     moveq    #0,d4                ;NOTE: AHISF_IMM *NOT* SET!!
  1878.     move.l    ahibase(pc),a6
  1879.     jsr    _LVOAHI_SetSound(a6)
  1880.  
  1881.     movem.l    (sp)+,d2-d4/a6
  1882. .exit    rts
  1883.  
  1884.  
  1885. lastinstrnum:    dc.w    0
  1886.  
  1887. mmusic:
  1888.     movem.l    d0-a6,-(sp)
  1889.  
  1890.     bsr.l    db_music
  1891.  
  1892. ;       cmp.w    #1,MIXITENABLE
  1893. ;    bne.s    .ominit
  1894. ;    moveq    #0,d0
  1895. ;    move.w    EndSongPos,d0
  1896. ;    cmp.w    SOngPos,d0
  1897. ;    bne.s    .ominit
  1898. ;
  1899. ;
  1900. ;    moveq    #0,d0
  1901. ;    move.w    SongPos,d0
  1902. ;    add.w    d0,d0
  1903. ;    lea    SongOrders,a0
  1904. ;    move.w    (a0,d0.w),d0
  1905. ;    add.w    d0,d0
  1906. ;    lea    PattLens,a0
  1907. ;    move.w    (a0,d0.w),d0
  1908. ;    subq    #1,d0
  1909. ;
  1910. ;    moveq    #0,d1
  1911. ;    move.w    PattPos,d1
  1912. ;    cmp.w    d0,d1
  1913. ;    bne.s    .ominit
  1914. ;    move.w    #1,StopITNOW
  1915. ;.ominit
  1916.     tst.w    StopEnable
  1917.     beq.s    No_clr_volumes
  1918.     bsr    stop_play
  1919. No_clr_volumes
  1920.     movem.l    (sp)+,d0-a6
  1921.     rts
  1922.  
  1923. clr_volumes:
  1924.     moveq    #0,d0
  1925.     moveq    #0,d1
  1926.     move.w    TrackNumber,d7
  1927.     subq    #1,d7
  1928. init_vols
  1929.     movem.l    d0-a6,-(sp)
  1930.     bsr.l    ahi_volume
  1931.     movem.l    (sp)+,d0-a6
  1932.     addq    #1,d0
  1933.     dbf    d7,init_vols
  1934.     rts
  1935.  
  1936. stop_play:
  1937.     clr.w    StopEnable
  1938.     moveq    #0,d0
  1939.     moveq    #0,d1
  1940.     move.w    TrackNumber,d7
  1941.     subq    #1,d7
  1942. clr_vols
  1943.     movem.l    d0-a6,-(sp)
  1944.     moveq    #AHISF_IMM,d4
  1945.     moveq    #AHI_NOSOUND,d1
  1946.     move.l    ahibase,a6
  1947.     move.l    ahi_ctrl,a2
  1948.     jsr    _LVOAHI_SetSound(a6)
  1949.     movem.l    (sp)+,d0-a6
  1950.     addq    #1,d0
  1951.     dbf    d7,clr_vols
  1952.     rts
  1953.  
  1954.  
  1955. FreeShortSamBuff:
  1956.     movem.l    d0-a6,-(sp)
  1957.     lea    SamBuff,a0
  1958.     moveq    #32-1,d7
  1959. .freeshortsambuffloop
  1960.     clr.l    (a0)
  1961.     clr.l    4(a0)
  1962.     add.l    #1024+16,a0
  1963.     dbf    d7,.freeshortsambuffloop
  1964.     movem.l    (sp)+,d0-a6
  1965.     rts
  1966.  
  1967. ahi_init:
  1968. .retry    bsr.l    ahi_initmain
  1969.     tst.l    d0
  1970.     beq.s    .ok
  1971.     bsr.l    OpenAhiError2
  1972.     bra    .retry
  1973. .ok    rts
  1974.  
  1975.  
  1976. ahi_initstart:
  1977.     bsr.l    ahi_initmain
  1978.     rts
  1979.  
  1980. ahi_initmain:
  1981.     OPENAHI 1
  1982.     move.l    d0,ahibase
  1983.     beq.w    ahi_eror_at_start
  1984.  
  1985.     move.l    d0,a6
  1986.     lea    ahi_tags(pc),a1
  1987.     jsr    _LVOAHI_AllocAudioA(a6)
  1988.     move.l    d0,ahi_ctrl
  1989.     beq.w    ahi_eror
  1990.  
  1991.     move.l    d0,a2
  1992.     moveq    #0,d0                ;Load module as one sound!
  1993.     moveq    #AHIST_SAMPLE,d1
  1994.     lea    ahi_sound0(pc),a0
  1995.     jsr    _LVOAHI_LoadSound(a6)
  1996.     tst.l    d0
  1997.     bne.w    ahi_eror_allocaudio_ok
  1998.  
  1999.     lea    ahi_ctrltags(pc),a1
  2000.     jsr    _LVOAHI_ControlAudioA(a6)
  2001.     tst.l    d0
  2002.     bne.w    ahi_eror_allocaudio_ok
  2003.  
  2004.     move.w    CiaTempo,d7
  2005.  
  2006.     movem.l    d0-d6/a0-a6,-(sp)
  2007.     moveq    #0,d0
  2008.     moveq    #0,d1
  2009.     move.w    RealTempo,d0
  2010.     move.w    d7,d1
  2011.     lsl.l    #8,d0
  2012.     divu    #125,d0
  2013.     and.l    #$ffff,d0
  2014.     mulu    d0,d1
  2015.     lsr.l    #8,d1
  2016.     move.w    d1,d7
  2017.     movem.l    (sp)+,d0-d6/a0-a6
  2018.  
  2019.     and.l    #$ffff,d7
  2020.     lsl.w    #1,d7
  2021.     divu    #5,d7
  2022.     and.l    #$ffff,d7
  2023.     swap    d7
  2024.     move.l    d7,afreq
  2025.  
  2026.     move.l    ahibase(pc),a6
  2027.     lea    atags(pc),a1
  2028.     move.l    ahi_ctrl(pc),a2
  2029.     jsr    _LVOAHI_ControlAudioA(a6)
  2030.  
  2031.     move.l    ahibase,a6
  2032.     move.l    #AHI_VOLBOOST,a0
  2033.  
  2034.     tst.w    AutoBoostEn
  2035.     beq.s    .nieauto
  2036.  
  2037.     move.l    20(a6),d0
  2038.     cmp.l    #$40063,d0
  2039.     blt.s    .nieauto
  2040.  
  2041.     moveq    #0,d0
  2042.     move.w    TrackNumber,d0
  2043.     mulu    #$4000,d0
  2044.     tst.w    MixItEnable
  2045.     bne.s    .nieauto
  2046.     move.l    d0,AhiBoost
  2047. .nieauto
  2048.     move.l    ahi_ctrl,a2
  2049.     jsr    _LVOAHI_Seteffect(a6)
  2050.  
  2051.     movem.l    d0-a6,-(sp)
  2052.     jsr    UpdateEffects
  2053.     movem.l    (sp)+,d0-a6
  2054.  
  2055.     moveq    #0,d0
  2056.     rts
  2057.  
  2058. ahi_eror_at_start:
  2059.     CLOSEAHI
  2060.     moveq    #-1,d0
  2061.     rts
  2062.  
  2063. ahi_eror:
  2064.     CLOSEAHI
  2065.     moveq    #-1,d0
  2066.     rts
  2067.  
  2068.  
  2069. ahi_eror_allocaudio_ok:
  2070.     move.l    ahibase(pc),d0
  2071.     beq.w    .exit
  2072.     move.l    ahibase(pc),d0
  2073.     move.l    d0,a6
  2074.     move.l    ahi_ctrl(pc),a2
  2075.     jsr    _LVOAHI_FreeAudio(a6)
  2076.  
  2077.     CLOSEAHI
  2078. .exit
  2079.     moveq    #-1,d0
  2080.     rts
  2081.  
  2082. ahi_end:
  2083.     move.l    ahibase(pc),d0
  2084.     beq.w    .exit
  2085.  
  2086.     move.l    ahibase(pc),a6
  2087.     lea    AHI_VOLBOOST,a0
  2088.     or.l    #AHIET_CANCEL,ahie_Effect(a0)
  2089.     move.l    ahi_ctrl(pc),a2
  2090.     jsr    _LVOAHI_Seteffect(a6)
  2091.     lea    AHI_VOLBOOST,a0
  2092.     eor.l    #AHIET_CANCEL,ahie_Effect(a0)
  2093.  
  2094.     bsr    EchoOff
  2095.  
  2096.     move.l    ahibase(pc),d0
  2097.     move.l    d0,a6
  2098.     move.l    ahi_ctrl(pc),a2
  2099.     jsr    _LVOAHI_FreeAudio(a6)
  2100.  
  2101.     CLOSEAHI
  2102.  
  2103.  
  2104.     lea    channel1,a0
  2105.     move.w    TrackNumber,d7
  2106.     subq    #1,d7
  2107. .clr    clr.w    MainVol(a0)
  2108.     clr.w    MainPeriod(a0)
  2109.     lea    ChanArea(a0),a0
  2110.     dbf    d7,.Clr
  2111.  
  2112. .exit
  2113.     rts
  2114.  
  2115.  
  2116.  
  2117. EchoEn:        dc.w    0
  2118.  
  2119. EchoON:
  2120. ; ---------------------------------------;
  2121.     move.w    Ahi_Chan+2,d7
  2122.     move.w    d7,mask1channels
  2123.  
  2124.     lea    mask1channels+2,a0
  2125.     subq    #1,d7
  2126. .test
  2127.     cmp.b    #AHIEDM_WET,(a0)+
  2128.     beq.s    .mam
  2129.     dbf    d7,.test
  2130.     tst.w    EchoEn
  2131.     bne.s    EchoOffMain
  2132.     rts
  2133. .mam
  2134. ; ---------------------------------------;
  2135.     clr.w    EchoEn
  2136.     move.l    ahibase,a6
  2137.     lea    mask1struct(pc),a0
  2138.     move.l    ahi_ctrl,a2
  2139.     jsr    _LVOAHI_Seteffect(a6)
  2140.  
  2141.  
  2142.     move.l    ahibase,a6
  2143.     move.l    #AHI_DSPEFF,a0
  2144.     move.l    ahi_ctrl,a2
  2145.     jsr    _LVOAHI_Seteffect(a6)
  2146.     rts
  2147.  
  2148.  
  2149.  
  2150.  
  2151.  
  2152.  
  2153.  
  2154.  
  2155. EchoOFF:
  2156. ; ---------------------------------------;
  2157.     move.w    Ahi_Chan+2,d7
  2158.     move.w    d7,mask1channels
  2159.  
  2160.     lea    mask1channels+2,a0
  2161.     subq    #1,d7
  2162. .test
  2163.     cmp.b    #AHIEDM_WET,(a0)+
  2164.     beq.s    .mam
  2165.     dbf    d7,.test
  2166.     rts
  2167. .mam
  2168. ; ---------------------------------------;
  2169. EchoOffMain
  2170.     clr.w    EchoEn
  2171.     move.l    ahibase(pc),a6
  2172.     lea    mask1struct(pc),a0
  2173.     or.l    #AHIET_CANCEL,ahie_Effect(a0)
  2174.     move.l    ahi_ctrl(pc),a2
  2175.     jsr    _LVOAHI_Seteffect(a6)
  2176.     lea    mask1struct(pc),a0
  2177.     eor.l    #AHIET_CANCEL,ahie_Effect(a0)
  2178.  
  2179.     move.l    ahibase(pc),a6
  2180.     lea    AHI_DSPEFF,a0
  2181.     or.l    #AHIET_CANCEL,ahie_Effect(a0)
  2182.     move.l    ahi_ctrl(pc),a2
  2183.     jsr    _LVOAHI_Seteffect(a6)
  2184.     lea    AHI_DSPEFF,a0
  2185.     eor.l    #AHIET_CANCEL,ahie_Effect(a0)
  2186.     rts
  2187.  
  2188.  
  2189. mask1struct
  2190.     dc.l    AHIET_DSPMASK
  2191. mask1channels
  2192.     dc.w    0
  2193.     blk.b    128,AHIEDM_DRY
  2194.     dc.l    TAG_DONE
  2195.  
  2196.  
  2197.  
  2198.  
  2199.  
  2200. db_init:
  2201.     move.w    GeneralTempo,CiaTempo
  2202.     moveq    #0,d0
  2203.     move.w    GeneralSpeed,d0
  2204.     move.b    d0,Orgtemp
  2205.  
  2206.     clr.w    SongPos
  2207.     clr.w    PattPos
  2208.     clr.b    Count
  2209.  
  2210.     bset    #1,$bfe001
  2211.     move.b    Orgtemp,Count
  2212.     rts
  2213.  
  2214. CheckCpu:
  2215.     move.l    ExecBase,a6
  2216.     moveq    #0,d0
  2217.     move.b    297(a6),d0
  2218.  
  2219.     move.b    #1,OldCPU
  2220. MC68000:
  2221.     btst    #0,d0
  2222.     beq.s    MC68010
  2223.     move.b    #1,OldCPU
  2224. MC68010:
  2225.     btst    #1,d0
  2226.     beq.s    MC68020
  2227.     clr.b    OldCPU
  2228. MC68020:
  2229.     btst    #2,d0
  2230.     beq.s    MC68030
  2231.     clr.b    OldCPU
  2232. MC68030:
  2233.     btst    #3,d0
  2234.     beq.s    MC68040
  2235.     clr.b    OldCPU
  2236. MC68040:
  2237.     rts
  2238.     
  2239. SongPos:    dc.w    0
  2240. PattPos:    dc.w    0
  2241. OldPattPos:    dc.w    0
  2242.  
  2243. OldCPU:        dc.b    0
  2244. temp:        dc.b    0
  2245. count:        dc.b    0
  2246. count2:        dc.b    0
  2247. JMPEN:        dc.b    0
  2248. PauseEn:    dc.b    0
  2249. hisam:        dc.b    0
  2250.         even
  2251.  
  2252. PauseVBL:    dc.w    0
  2253. OldDepAdr:    dc.l    0
  2254. ;modDIGI:    dc.l    0
  2255. channelenable:    dc.w    0
  2256. MixPeriodA:    dc.w    0
  2257. MixPeriodB:    dc.w    0
  2258. leng:        dc.w    0
  2259. whichchan:    dc.w    0
  2260. CiaTempo:    dc.w    0
  2261. CiaChanged:    dc.w    0
  2262. GlobalVol:    dc.w    64
  2263. OldGlobalVol:    dc.w    0
  2264.  
  2265. ; ------------------- Paremeters --------------
  2266.  
  2267.  
  2268. db_music:
  2269. ; free a0,a2,a3,
  2270.  
  2271.     move.b    count2(pc),d7
  2272.     cmp.b    temp(pc),d7
  2273.     blt.s    .NoNewPos
  2274.     clr.b    count2
  2275. .NoNewPos
  2276.  
  2277.  
  2278.  
  2279.     tst.b    temp
  2280.     beq.s    DepackDone
  2281.  
  2282.     move.b    count(pc),d7
  2283.     cmp.b    temp(pc),d7
  2284.     blt.s    DepackDone
  2285.  
  2286.     moveq    #0,d6
  2287.     moveq    #0,d7
  2288.     move.w    OrdNum,d7
  2289.     move.w    SongPos(pc),d6
  2290.     cmp.w    d6,d7
  2291.     bge.s    NoRepeatSong
  2292.     clr.w    SongPos
  2293.     clr.w    PattPos
  2294. NoRepeatSong:
  2295.  
  2296.     moveq    #0,d7
  2297.     move.w    SongPos(pc),d7
  2298.     lea    SongOrders,a0
  2299.     move.w    (a0,d7.w*2),d7
  2300.     lea    PattAdresses,a1
  2301.     move.l    (a1,d7.w*4),a1
  2302.  
  2303.     move.w    PattPos(pc),d7
  2304.     moveq    #0,d6
  2305.     move.w    TrackNumber,d6
  2306.     mulu    #6,d6
  2307.     mulu    d6,d7
  2308.     add.l    d7,a1
  2309.  
  2310.     lea    UnPackedData,a6
  2311.     move.l    d6,d7
  2312.     lsr.w    #2,d7
  2313.     subq    #1,d7
  2314. CopyDataLoop
  2315.     move.l    (a1)+,(a6)+
  2316.     dbf    d7,CopyDataLoop
  2317.  
  2318. DepackDone
  2319.  
  2320. DB_musicMAIN:
  2321.  
  2322.     lea    UnPackedData,a1
  2323.  
  2324. ***************
  2325.     tst.b    SPAHIENABLE
  2326.     bne.w    ominplaykey
  2327. ***************
  2328.  
  2329.     moveq    #0,d6
  2330.     moveq    #0,d0
  2331.     lea    Channel1,a6
  2332.     moveq    #0,d7
  2333.     move.w    TrackNumber,d7
  2334.     subq    #1,d7
  2335. channelsloopM:
  2336.     movem.l    d0/d7/a6,-(sp)
  2337.  
  2338. ; -------------------------------------------------------
  2339.     move.w    MainVol(a6),d1
  2340.     cmp.w    OldMainVol(a6),d1
  2341.     bne.s    .doit0
  2342.  
  2343.     move.w    GlobalVol(pc),d1
  2344.     cmp.w    OldGlobalVol(pc),d1
  2345.     bne.s    .doit0
  2346.  
  2347.     move.w    MasterVol(pc),d1
  2348.     cmp.w    OldMasterVol(pc),d1
  2349.     bne.s    .doit0
  2350.  
  2351.     move.l    PanPos(a6),d1
  2352.     cmp.l    OldPanPos(a6),d1
  2353.     beq.s    .skip0
  2354. .doit0
  2355.     bsr.w    ahi_volume
  2356.     move.w    MainVol(a6),OldMainVol(a6)
  2357.     move.l    PanPos(a6),OldPanPos(a6)
  2358. .skip0
  2359.  
  2360.     moveq    #0,d1
  2361.     move.w    MainPeriod(a6),d1
  2362.     beq.s    .skip1
  2363.     cmp.w    OldPeriod(a6),d1
  2364.     bne.s    .doit1
  2365.  
  2366.     move.w    RealTempo(pc),d2
  2367.     cmp.w    OldRealTempo(pc),d2
  2368.     beq.s    .skip1
  2369.  
  2370. .doit1
  2371.     bsr    ahi_period
  2372. .skip1
  2373.     move.w    MainPeriod(a6),OldPeriod(a6)
  2374.  
  2375.  
  2376.     lea    SampleOffsets,a4
  2377.     tst.l    (a4,d0.w*4)
  2378.     beq.s    .zero
  2379.  
  2380.     move.l    LastFreq(a6),d2
  2381.  
  2382.     lea    LoopTab,a5
  2383.     move.w    OldD1(a6),d1
  2384.     lsr.w    #2,d1
  2385.     addq    #1,d1
  2386.  
  2387.     lea    ahi_channels,a3
  2388.     move.b    2(a3,d0.w*4),d4
  2389.  
  2390.     btst    #1,(a5,d1.w)
  2391.     beq.s    .nopingpong
  2392.     eor.b    #1,d4
  2393. .nopingpong
  2394.     tst.b    d4
  2395.     beq.s    .add
  2396.     sub.l    d2,(a4,d0.w*4)
  2397.     bra.s    .zero
  2398. .add
  2399.     add.l    d2,(a4,d0.w*4)
  2400.  
  2401. .zero
  2402.     moveq    #0,d1
  2403.     move.w    OldD1(a6),d1
  2404.     bsr    ahi_sample
  2405.  
  2406. ; -------------------------------------------------------
  2407.     movem.l    (sp)+,d0/d7/a6
  2408.     lea    ChanArea(a6),a6
  2409.     addq    #1,d0
  2410.     dbf    d7,ChannelsLoopM
  2411.  
  2412.     move.w    MasterVol(pc),OldMasterVol
  2413.     move.w    GlobalVol(pc),OldGlobalVol
  2414.  
  2415. ***************
  2416.     bra.s    noominplaykey
  2417. ominplaykey
  2418.     clr.b    SPAHIENABLE
  2419. noominplaykey
  2420. ***************
  2421.  
  2422.  
  2423.     move.w    SongPos(pc),OldSPos
  2424.  
  2425.     lea    channel1,a6
  2426.     lea    SamVol,a4
  2427.     bsr    MIXCHAN
  2428.  
  2429.  
  2430. ;    tst.w    EchoEn2
  2431. ;    bne.s    .mam
  2432.     tst.w    EchoEn
  2433.     beq.s    .noEchoChanged
  2434. .mam
  2435.     movem.l    d0-a6,-(sp)
  2436.     bsr.w    EchoOn
  2437.     movem.l    (sp)+,d0-a6
  2438. .noEchoChanged
  2439.  
  2440.     tst.b    temp
  2441.     beq.w    No_new
  2442.  
  2443.     tst.w    PauseVBL
  2444.     beq.s    NoPause
  2445.     move.b    #1,PauseEn
  2446.     subq.w    #1,PauseVBL
  2447. NoPause:
  2448.  
  2449.     move.b    count(pc),d7
  2450.     cmp.b    temp(pc),d7
  2451.     blt.s    NoNEWPos
  2452.     clr.b    count
  2453.  
  2454.     tst.w    PauseVBL
  2455.     bne.s    DoPAUSE
  2456.  
  2457.     addq.w    #1,pattpos
  2458.     clr.b    PauseEn
  2459.  
  2460.     tst.b    temp
  2461.     beq.s    NoNewPos
  2462.  
  2463.     move.l    a0,-(sp)
  2464.     moveq    #0,d7
  2465.     move.w    SongPos(pc),d7
  2466.     lea    SongOrders,a0
  2467.     add.w    d7,d7
  2468.     move.w    (a0,d7.w),d7
  2469.     lsl.w    #1,d7
  2470.     lea    PattLens,a0
  2471.     move.w    (a0,d7.w),d7
  2472.     move.l    (sp)+,a0
  2473.  
  2474.     moveq    #0,d3
  2475.     move.w    PattPos,d3
  2476.     cmp.w    d7,d3
  2477.     blt.s    NoNewPos
  2478. .newpos
  2479.     clr.w    PattPos
  2480.     addq.w    #1,SongPos
  2481. NoNewPos:
  2482.  
  2483. DoPAUSE
  2484.     addq.b    #1,count
  2485.     addq.b    #1,count2
  2486. *
  2487.     tst.w    PlayPattEn
  2488.     beq.s    .ok
  2489.     move.w    OldSpos,d7
  2490.     cmp.w    SongPos(pc),d7
  2491.     beq.s    .ok
  2492.     move.w    d7,SongPos
  2493. .ok
  2494. *
  2495. No_NEW
  2496.     move.w    RealTempo,OldRealTempo
  2497.     rts
  2498.  
  2499.  
  2500. ahi_volume:
  2501.     movem.l    d0-d3/a0-a2/a6,-(sp)
  2502.  
  2503.     moveq    #0,d1
  2504.     move.w    MainVol(a6),d1
  2505.     cmp.l    #$40*256,d1
  2506.     ble.s    .okV1
  2507.     move.l    #$40*256,d1
  2508. .okV1
  2509.  
  2510.     move.w    GlobalVol(pc),d2
  2511.     cmp.w    #$40,d2
  2512.     ble.s    .okV2
  2513.     moveq    #$40,d2
  2514. .okV2
  2515.     mulu.w    d2,d1
  2516.     lsr.l    #6,d1
  2517.  
  2518.     move.w    MasterVol(pc),d2
  2519.     cmp.w    #$40,d2
  2520.     ble.s    .okV3
  2521.     moveq    #$40,d2
  2522. .okV3
  2523.     mulu.w    d2,d1
  2524.     lsr.l    #4,d1
  2525.  
  2526.  
  2527.     move.l    PanPos(a6),d2
  2528.  
  2529.     move.l    ahibase(pc),a6
  2530.  
  2531.     movem.l    d0-a6,-(sp)
  2532.     moveq    #AHISF_IMM,d3
  2533.     move.l    ahi_ctrl,a2
  2534.     jsr    _LVOAHI_SetVol(a6)
  2535.     movem.l    (sp)+,d0-a6
  2536.  
  2537.     movem.l    (sp)+,d0-d3/a0-a2/a6
  2538.     rts
  2539.  
  2540. ahi_period:
  2541.     movem.l    d0-d2/a0-a2/a6,-(sp)
  2542.  
  2543.     move.l    #3546895*4,d2
  2544.     divu.l    d1,d2
  2545.     move.l    d2,d1
  2546.  
  2547.  
  2548.     moveq    #0,d7
  2549.     move.w    RealTempo,d7
  2550.     cmp.w    OldRealTempo,d7
  2551.     bne.s    .doit
  2552.  
  2553.     moveq    #0,d7
  2554.     move.w    Mainperiod(a6),d7
  2555.     cmp.w    OldPeriod(a6),d7
  2556.     beq.w    .nonote
  2557. .doit
  2558.     movem.l    d0/d2-a6,-(sp)
  2559.     move.l    d1,d2
  2560.     moveq    #0,d1
  2561.     move.l    #125,d0
  2562.     move.w    RealTempo,d1
  2563.     lsl.l    #8,d1
  2564.     divu    d0,d1
  2565.     and.l    #$ffff,d1
  2566.     lsr.l    #2,d2
  2567.     mulu.l    d1,d2
  2568.     lsr.l    #6,d2
  2569.     move.l    d2,d1
  2570.     movem.l    (sp)+,d0/d2-a6
  2571.  
  2572.  
  2573.     cmp.l    #2^20,d1
  2574.     ble.s    .ok
  2575.     clr.b    OffEnable(a6)
  2576.     moveq    #AHISF_IMM,d4
  2577.     moveq    #AHI_NOSOUND,d1
  2578.     move.l    ahibase,a6
  2579.     move.l    ahi_ctrl,a2
  2580.     jsr    _LVOAHI_SetSound(a6)
  2581.     bra.s    .exit
  2582. .ok
  2583.  
  2584.     move.l    d1,-(sp)
  2585.     divu    #50,d1
  2586.     and.l    #$ffff,d1
  2587.     mulu    #125,d1
  2588.     divu.w    RealCiaTempo(pc),d1
  2589.     and.l    #$ffff,d1
  2590.     move.l    d1,LastFreq(a6)
  2591.     move.l    (sp)+,d1
  2592.  
  2593.     move.l    ahibase,a6
  2594.     moveq    #AHISF_IMM,d2
  2595.     move.l    ahi_ctrl,a2
  2596.     jsr    _LVOAHI_SetFreq(a6)
  2597. .exit
  2598. .nonote
  2599.  
  2600.     movem.l    (sp)+,d0-d2/a0-a2/a6
  2601.     rts
  2602.  
  2603. RealCiaTempo    dc.w    125
  2604. RealTempo:    dc.w    125
  2605. OldRealTempo:    dc.w    0
  2606. MasterVol:    dc.w    64
  2607. OldMasterVol:    dc.w    0
  2608.  
  2609. ahi_sample:
  2610.     movem.l    d0-d2/a0-a2/a6,-(sp)
  2611.  
  2612.     tst.b    OffEnable(a6)
  2613.     beq.w    .exit
  2614.     clr.b    OffEnable(a6)
  2615.  
  2616.  
  2617.     moveq    #0,d3
  2618.     cmp.w    #$e40,Oldd2(a6)
  2619.     beq.w    .playmain
  2620.     cmp.w    #$e40,Oldd6(a6)
  2621.     beq.w    .playmain
  2622.  
  2623.     move.w    Oldd2(a6),d2
  2624.     lsr.w    #8,d2
  2625.     cmp.b    #3,d2
  2626.     beq.w    .exit
  2627.     cmp.b    #5,d2
  2628.     beq.w    .exit
  2629.     move.w    Oldd6(a6),d6
  2630.     lsr.w    #8,d6
  2631.     cmp.b    #3,d6
  2632.     beq.w    .exit
  2633.     cmp.b    #5,d6
  2634.     beq.w    .exit
  2635.  
  2636. ; ---------------------- calc sam offset
  2637.     moveq    #0,d4
  2638.     moveq    #0,d7
  2639.     move.b    SamOffsetA(a6),d7
  2640.     lsl.w    #8,d7
  2641.     lsl.l    #8,d7
  2642.  
  2643.     cmp.b    #$9,d2
  2644.     bne.s    .nosamoffset1
  2645.     add.l    d7,d4
  2646.     moveq    #0,d7
  2647.     move.w    OldD2(a6),d7
  2648.     and.w    #$00ff,d7
  2649.     lsl.w    #8,d7
  2650.     add.l    d7,d4
  2651.     lsr.w    #8,d7
  2652.     tst.w    d7
  2653.     beq.s    .nosend1
  2654.     move.w    d7,SlideSamOffset(a6)
  2655. .nosend1
  2656.     moveq    #0,d7
  2657. .nosamoffset1
  2658.     cmp.b    #$9,d6
  2659.     bne.s    .nosamoffset2
  2660.     add.l    d7,d4
  2661.     moveq    #0,d7
  2662.     move.w    OldD6(a6),d7
  2663.     and.w    #$00ff,d7
  2664.     lsl.w    #8,d7
  2665.     add.l    d7,d4
  2666.     move.l    d4,d7
  2667.     lsr.l    #8,d7
  2668.     tst.w    d7
  2669.     beq.s    .nosend2
  2670.     move.w    d7,SlideSamOffset(a6)
  2671. .nosend2
  2672. .nosamoffset2
  2673.  
  2674.     moveq    #0,d4
  2675.     move.w    SlideSamOffset(a6),d4
  2676.     lsl.l    #8,d4
  2677. ; --------------------------------------
  2678.  
  2679.  
  2680.     lea    Instruments,a0
  2681.     move.l    d1,d7
  2682.     lsl.w    #2,d7
  2683.     add.l    #16,d7
  2684.     and.l    #$ffff,d7
  2685.  
  2686.     lsr.l    #1,d1
  2687.     moveq    #0,d2
  2688.     move.w    2(a0,d1.w),d2
  2689.  
  2690. ; -------------------------------- do sample cursora
  2691.     cmp.w    InstrNum,d2
  2692.     bne.s    .notthis
  2693.     move.w    d0,ACTCHAN
  2694. .notthis
  2695. ; ----------------------------------------------------
  2696.  
  2697.     subq    #1,d2
  2698.     lsl.l    #2,d2
  2699.     move.l    d2,d1
  2700.  
  2701.     move.l    d1,d2
  2702.     addq.l    #4,d2
  2703.     lsr.l    #2,d2
  2704.     lea    ahi_channels,a0
  2705.     move.l    d2,(a0,d0.l*4)            ;store instr for each channel
  2706.     move.w    d7,(a0,d0.l*4)
  2707.  
  2708.     addq.l    #4,d1
  2709.     lsl.l    #2,d1
  2710.  
  2711.     lea    ahi_samples,a0
  2712.     move.l    (a0,d1.l),d2            ;start
  2713.  
  2714.     cmp.l    #0,Ahi_Sound0
  2715.     beq.s    .no16bit_1
  2716.     lsr.l    #1,d2
  2717. .no16bit_1
  2718.  
  2719.     add.l    d4,d2
  2720.     move.l    4(a0,d1.l),d3            ;length
  2721.  
  2722.     move.l    d7,d1
  2723.  
  2724.  
  2725.     sub.l    d4,d3
  2726.     bgt.s    .NieWyszlo1            ; gdy po dodaniu offsetu end<0 offsam
  2727.  
  2728.     tst.l    12(a0,d1.l)            ; ale gdy sampl jest zapetlony gra go
  2729.     beq.s    .ONEshotSample1
  2730.     move.l    (a0,d1.l),d2
  2731.     cmp.l    #0,Ahi_Sound0
  2732.     beq.s    .no16bit_2
  2733.     lsr.l    #1,d2
  2734. .no16bit_2
  2735.     add.l    8(a0,d1.l),d2
  2736.     move.l    12(a0,d1.l),d3
  2737.     bra.s    .WyszloZapetlenieDONE
  2738. .ONEshotSample1
  2739.     moveq    #AHI_NOSOUND,d1
  2740.     moveq    #AHISF_IMM,d4
  2741.     bra.w    .length_ok
  2742. .NieWyszlo1
  2743.  
  2744.     tst.l    12(a0,d1.l)
  2745.     beq.s    .ONEshotSample2
  2746.     move.l    8(a0,d1.l),d3
  2747.     add.l    12(a0,d1.l),d3
  2748.     sub.l    d4,d3
  2749.     bgt.s    .NieWyszlo2            ; gdy po dodaniu offsetu end<0 offsam
  2750.     move.l    (a0,d1.l),d2
  2751.     cmp.l    #0,Ahi_Sound0
  2752.     beq.s    .no16bit_3
  2753.     lsr.l    #1,d2
  2754. .no16bit_3
  2755.     add.l    8(a0,d1.l),d2
  2756.     move.l    12(a0,d1.l),d3
  2757. .NieWyszlo2
  2758.  
  2759. .ONEshotSample2
  2760.  
  2761. .WyszloZapetlenieDONE
  2762.  
  2763. ; ------------- test backward
  2764.     move.w    Oldd2(a6),d7
  2765.     lsr.w    #4,d7
  2766.     cmp.b    #$e3,d7
  2767.     beq.s    .backwd
  2768.     move.w    Oldd6(a6),d7
  2769.     lsr.w    #4,d7
  2770.     cmp.b    #$e3,d7
  2771.     bne.s    .no_backwd
  2772. .backwd
  2773.     add.l    d3,d2
  2774.     not.l    d3
  2775. .no_backwd
  2776. ; ----------------------------
  2777.  
  2778. .playmain
  2779.     moveq    #0,d1                ;sample bank
  2780.     moveq    #AHISF_IMM,d4
  2781.  
  2782.     lea    SampleOffsets,a6
  2783.     move.l    d2,(a6,d0.w*4)            ;start
  2784.  
  2785.  
  2786.  
  2787.     lea    SampleOffsetsFT,a6
  2788.     move.b    #1,(a6,d0.w)
  2789.  
  2790.  
  2791.     tst.l    d3
  2792.     bne.b    .length_ok            ;length=0 means "no sound"
  2793.     moveq    #AHI_NOSOUND,d1
  2794. .length_ok
  2795.  
  2796.     lea    SampleOffsets,a6
  2797.     cmp.l    #AHI_NOSOUND,d1
  2798.     bne.s    .nozero
  2799.     move.l    #0,(a6,d0.w*4)            ;start
  2800.     lea    SampleOffsetsFT,a6
  2801.     clr.b    (a6,d0.w)
  2802. .nozero
  2803.  
  2804.     move.l    ahibase,a6
  2805.     move.l    ahi_ctrl,a2
  2806.     jsr    _LVOAHI_SetSound(a6)
  2807.  
  2808. .exit    movem.l    (sp)+,d0-d2/a0-a2/a6
  2809.     rts
  2810.  
  2811. MIXCHAN:
  2812.     moveq    #0,d7
  2813.     move.w    TrackNumber,d7
  2814.     subq    #1,d7
  2815.     clr.w    WhichChan
  2816. ChannelsLoop:
  2817.     addq.w    #1,WhichChan
  2818.     move.l    d7,-(sp)
  2819.     move.w    Oldd0(a6),d0
  2820.     move.w    Oldd1(a6),d1
  2821.     move.w    Oldd2(a6),d2
  2822.     move.w    Oldd6(a6),d6
  2823.     bsr    mainPROC
  2824.     move.w    d0,Oldd0(a6)
  2825.     move.w    d1,Oldd1(a6)
  2826.     move.w    d2,Oldd2(a6)
  2827.     move.w    d6,Oldd6(a6)
  2828.     lea    ChanArea(a6),a6
  2829.     addq.w    #6,a1
  2830.     move.l    (sp)+,d7
  2831.     dbf    d7,ChannelsLoop
  2832.     rts
  2833.  
  2834.  
  2835.  
  2836. ************* finetunes **********************************************
  2837.  
  2838. FINETUNES:
  2839.     movem.l    d1-a6,-(sp)
  2840.     lea    SamFin,a2
  2841.     moveq    #0,d4
  2842.     moveq    #0,d3
  2843.     add.w    d7,d7
  2844.     move.l    (a2,d7.w),d4
  2845.     tst.w    d0
  2846.     beq.s    .fintdone
  2847.  
  2848.     move.l    #3579545,d1
  2849.     divu    d0,d1
  2850.     and.l    #$ffff,d1
  2851. .ok8
  2852.     lsl.l    #8,d4
  2853.     beq.s    .ok7
  2854.     move.l    #8363,d2
  2855.     divu    d2,d4
  2856. .ok7    and.l    #$ffff,d4
  2857.  
  2858.     mulu    d4,d1
  2859.     lsr.l    #8,d1
  2860.  
  2861.     move.l    #3579545,d0
  2862.     tst.l    d1
  2863.     bne.s    .ok9
  2864.     moveq    #1,d1
  2865. .ok9
  2866.     divu.l    d1,d0
  2867.  
  2868. .fintdone
  2869.     movem.l    (sp)+,d1-a6
  2870.     move.w    d0,OrgPeriod(a6)
  2871.     rts
  2872.  
  2873. ; -------------- main procedure ----------------------------
  2874. mainPROC:
  2875.     move.w    OldVolA(a6),VolA(a6)
  2876.     move.w    OldVolB(a6),VolB(a6)
  2877.  
  2878.     tst.b    Temp
  2879.     beq.w    NothingToDo ;Old_data
  2880.  
  2881.     move.b    count(pc),d7
  2882.     cmp.b    temp(pc),d7
  2883.     blt    old_data
  2884.  
  2885.     tst.b    PauseEn
  2886.     bne.w    oldperiod_1
  2887.  
  2888.     moveq    #0,d3
  2889.  
  2890.     tst.b    (a1)
  2891.     beq.w    oldperiod_1
  2892.  
  2893.     cmp.b    #$1f,(a1)
  2894.     bne.s    .novolenvoff
  2895.     addq.b    #1,VolEnvOff(a6)
  2896.     addq.b    #1,PanEnvOff(a6)
  2897.     bra.w    oldInstrNum_1
  2898. .novolenvoff
  2899.  
  2900.     clr.w    NoLoopEnable
  2901.     clr.w    OldPeriod(a6)
  2902.  
  2903.     clr.w    VibratoDatasA(a6)
  2904.     clr.w    VibratoDatasB(a6)
  2905.  
  2906.     move.w    2(a1),d7
  2907.     cmp.w    #$ed0,d7
  2908.     beq.s    .ClrEnvDatas
  2909.     and.w    #$fff0,d7
  2910.     cmp.w    #$ed0,d7
  2911.     beq.s    .NoClrEnvDatas
  2912.  
  2913.     move.w    4(a1),d7
  2914.     cmp.w    #$ed0,d7
  2915.     beq.s    .ClrEnvDatas
  2916.     and.w    #$fff0,d7
  2917.     cmp.w    #$ed0,d7
  2918.     beq.s    .NoClrEnvDatas
  2919. .ClrEnvDatas
  2920.     clr.b    VolEnvOff(a6)
  2921.     clr.b    VolEnvMode(a6)
  2922.     clr.w    VolEnvTime(a6)
  2923.  
  2924.     clr.b    PanEnvOff(a6)
  2925.     clr.b    PanEnvMode(a6)
  2926.     clr.w    PanEnvTime(a6)
  2927. .NoClrEnvDatas
  2928.     move.b    #1,OffEnable(a6)
  2929.     move.b    #1,EqNewSamA(a6)
  2930.  
  2931.     moveq    #0,d0
  2932.     move.b    (a1),d0
  2933.  
  2934.     move.l    a3,-(sp)
  2935.     lea    Periods,a3
  2936.     moveq    #0,d3
  2937.     move.b    d0,d3
  2938.     lsr.b    #4,d3
  2939.     subq.b    #1,d3
  2940.     mulu    #24,d3
  2941.     and.b    #$0f,d0
  2942.     add.w    d0,d0
  2943.     add.w    d3,d0
  2944.     move.w    (a3,d0.w),d0
  2945.     move.l    (sp)+,a3
  2946.  
  2947.     move.w    2(a1),d7
  2948.     and.w    #$ff00,d7
  2949.     cmp.w    #$300,d7
  2950.     bne.s    NoClrGliss_1
  2951.     clr.w    GlissandoDatasA+4(a6)
  2952. NoClrGliss_1
  2953.     move.w    4(a1),d7
  2954.     and.w    #$ff00,d7
  2955.     cmp.w    #$300,d7
  2956.     bne.s    NoClrGliss_2
  2957.     clr.w    GlissandoDatasB+4(a6)
  2958. NoClrGliss_2
  2959.  
  2960.     cmp.b    #$18,2(a1)
  2961.     beq.s    .NoClrSlideOffset
  2962.     cmp.b    #$18,4(a1)
  2963.     beq.s    .NoClrSlideOffset
  2964.     cmp.w    #$0900,2(a1)
  2965.     beq.s    .NoClrSlideOffset
  2966.     cmp.w    #$0900,4(a1)
  2967.     beq.s    .NoClrSlideOffset
  2968.     clr.w    SlideSamOffset(a6)
  2969. .NoClrSlideOffset
  2970.  
  2971.     move.w    d0,OrgPeriodARP(a6)
  2972.     moveq    #0,d7
  2973.     move.b    1(a1),d7
  2974.     tst.w    d7
  2975.     bne.s    .notakeold
  2976.     moveq    #0,d7
  2977.     move.b    OldInstrNumA(a6),d7
  2978.     moveq    #0,d1
  2979.     move.b    d7,d1
  2980.     subq    #1,d1
  2981.     lsl.w    #2,d1
  2982. .notakeold
  2983.     add.w    d7,d7
  2984.     bsr    FINETUNES
  2985.  
  2986. *********************************************************************
  2987.  
  2988.  
  2989. oldperiod_1:
  2990.     tst.b    1(a1)
  2991.     beq.w    oldInstrNum_1
  2992.     moveq    #0,d1
  2993.     move.b    1(a1),d1
  2994.     move.b    d1,OldInstrNumA(a6)
  2995.     subq    #1,d1
  2996.     moveq    #0,d2
  2997.  
  2998.     move.b    (a4,d1.w),d2
  2999.     lsl.w    #8,d2
  3000.     move.w    d2,VolA(a6)
  3001.  
  3002.  
  3003. ; ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp
  3004.     move.l    d0,-(sp)
  3005.     lea    InstrGeneralPan,a0
  3006.     move.w    2(a0,d1.w*2),GeneralPan(a6)
  3007.     move.l    (sp)+,d0
  3008. ; ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp
  3009.  
  3010.     lsl.w    #2,d1
  3011. oldInstrNum_1
  3012.  
  3013.     move.w    2(a1),d2
  3014.     move.w    4(a1),d6
  3015.     move.l    d0,-(sp)
  3016.     moveq    #0,d0
  3017.     move.w    d2,d0
  3018.     and.w    #$ff00,d0
  3019.  
  3020.     cmp.w    #$1400,d0
  3021.     bne.s    .onkeyoff1
  3022.     and.w    #$00ff,d2
  3023.     cmp.w    #$f,d2
  3024.     ble.s    .oki1
  3025.     moveq    #$0,d2
  3026.     bra.s    .onkeyoff1
  3027. .oki1
  3028.     and.w    #$000f,d2
  3029.     add.w    #$ec0,d2
  3030. .onkeyoff1
  3031.  
  3032.     moveq    #0,d0
  3033.     move.w    d6,d0
  3034.     and.w    #$ff00,d0
  3035.  
  3036.     cmp.w    #$1400,d0
  3037.     bne.s    .onkeyoff2
  3038.     and.w    #$00ff,d6
  3039.     cmp.w    #$f,d6
  3040.     ble.s    .oki2
  3041.     moveq    #$0,d6
  3042.     bra.s    .onkeyoff2
  3043. .oki2
  3044.     and.w    #$000f,d6
  3045.     add.w    #$ec0,d6
  3046. .onkeyoff2
  3047.     move.l    (sp)+,d0
  3048.  
  3049.  
  3050.     move.l    a5,-(sp)
  3051.     bsr    EffectCommandsA2
  3052.     bsr    EffectCommandsB2
  3053.     move.l    (sp)+,a5
  3054.  
  3055.  
  3056.     tst.b    OnOffChanA(a6)
  3057.     beq.s    No_Stop1
  3058.     move.w    #$e40,d2
  3059.     move.b    #1,OffEnable(a6)
  3060. No_Stop1:
  3061.  
  3062. old_data:
  3063.  
  3064.     move.b    temp(pc),d7
  3065.     subq    #1,d7
  3066.     cmp.b    count(pc),d7
  3067.     bne.s    no_CLReff
  3068.     move.w    d2,d7
  3069.     lsr.w    #8,d7
  3070.     cmp.b    #8,d7
  3071.     beq.s    no_CLReff1
  3072.     cmp.b    #3,d7
  3073.     beq.s    no_CLReff1
  3074.     cmp.b    #4,d7
  3075.     beq.s    no_CLReff1
  3076.     cmp.b    #5,d7
  3077.     beq.s    CLReffSP1
  3078.     TST.b    d7
  3079.     beq.s    no_CLReff1
  3080.  
  3081.     move.w    d2,d7
  3082.     lsr.w    #4,d7
  3083.     cmp.w    #$ec,d7
  3084.     beq.s    no_CLReff1
  3085.     cmp.w    #$e9,d7
  3086.     beq.s    no_CLReff1
  3087.     cmp.w    #$ed,d7
  3088.     beq.s    no_CLReff1
  3089.     moveq    #0,d2
  3090.     bra.s    no_CLReff1
  3091. CLReffSP1:
  3092.     move.w    #$0300,d2
  3093. no_CLReff1
  3094.     move.w    d6,d7
  3095.     lsr.w    #8,d7
  3096.     cmp.b    #3,d7
  3097.     beq.s    no_CLReff2
  3098.     cmp.b    #4,d7
  3099.     beq.s    no_CLReff2
  3100.     cmp.b    #5,d7
  3101.     beq.s    CLReffSP2
  3102.     TST.b    d7
  3103.     beq.s    no_CLReff2
  3104.  
  3105.     move.w    d6,d7
  3106.     lsr.w    #4,d7
  3107.     cmp.w    #$ec,d7
  3108.     beq.s    no_CLReff2
  3109.     cmp.w    #$e9,d7
  3110.     beq.s    no_CLReff2
  3111.     cmp.w    #$ed,d7
  3112.     beq.s    no_CLReff2
  3113.  
  3114.     moveq    #0,d6
  3115.     bra.s    no_CLReff2
  3116. CLReffSP2:
  3117.     move.w    #$0300,d6
  3118. no_CLReff2
  3119.  
  3120. no_CLReff
  3121.  
  3122. nothingtodo
  3123.  
  3124.     move.l    a5,-(sp)
  3125.     bsr    EffectCommandsA
  3126.     bsr    EffectCommandsB
  3127.     move.l    (sp)+,a5
  3128.  
  3129.     move.w    d0,GlissandoDatasA+2(a6)
  3130.     move.w    d0,GlissandoDatasB+2(a6)
  3131.  
  3132.     tst.w    d0
  3133.     beq.s    nothing
  3134.  
  3135. ; -----------------------------------
  3136.     bsr.s    VolumeEnvelope
  3137. ; -----------------------------------
  3138.  
  3139.     move.w    d0,MainPeriod(a6)
  3140.     tst.w    d7
  3141.     bne.s    .onim
  3142.     move.w    VolA(a6),MainVol(a6)
  3143. .onim
  3144.  
  3145.     tst.w    MainVol(a6)
  3146.     beq.s    .noPan
  3147.  
  3148. ; -----------------------------------
  3149.     move.l    #$7fff,d3
  3150.     bsr.w    PanningEnvelope
  3151.  
  3152. ; -----------------------------------------------------
  3153. ;   FinalPan=Pan+(EnvelopePan-32)*(128-Abs(Pan-128))/32;
  3154. ; -----------------------------------------------------
  3155. ;    d3        =     EnvelopePan 0-$10000
  3156. ;    d4        =     GeneralPan 0-256
  3157.  
  3158.     moveq    #0,d4
  3159.     move.w    GeneralPan(a6),d4        ; GeneralPan    0-256
  3160.  
  3161.  
  3162.     movem.l    d5/d6,-(sp)
  3163.     sub.l    #$7fff,d3
  3164.     move.l    d4,d6
  3165.  
  3166.  
  3167.     sub.w    #128,d4
  3168.     tst.w    d4
  3169.     bge.s    .okp1
  3170.     muls    #-1,d4
  3171. .okp1
  3172.     move.l    #128,d5
  3173.     sub.w    d4,d5
  3174.  
  3175.     lsl.l    #8,d5
  3176.     muls.l    d5,d3
  3177.     divs.l    #$7fff,d3
  3178.  
  3179.     
  3180.     lsl.l    #8,d6
  3181.     add.l    d6,d3
  3182.  
  3183.     move.l    d3,PanPos(a6)
  3184.     movem.l    (sp)+,d5/d6
  3185.  
  3186. .noPan
  3187. ; -----------------------------------
  3188.  
  3189.     move.w    VolA(a6),OldVolA(a6)
  3190.     move.w    VolB(a6),OldVolB(a6)
  3191.     rts
  3192.  
  3193.  
  3194. nothing:
  3195.     tst.w    MainPeriod(a6)
  3196.     beq.s    nostopperiod
  3197.     move.w    #-1,MainPeriod(a6)
  3198. nostopperiod
  3199.     rts
  3200.  
  3201.  
  3202.  
  3203. ;- - - - - - - - - - - -  envelopes
  3204. VolumeEnvelope:
  3205.     movem.l    d0-d6/a0-a6,-(sp)
  3206.  
  3207.  
  3208.     lsr.l    #2,d1
  3209.  
  3210. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3211.     lea    LoopTab,a0
  3212.     move.b    1(a0,d1.w),d6
  3213.     lsr.b    #1,d6
  3214. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3215.  
  3216.     lea    VolEnvelope,a0
  3217.     mulu    #134,d1
  3218.     add.w    d1,a0
  3219.  
  3220.     tst.b    VolEnvOff(a6)
  3221.     beq.s    .doenvelope
  3222.     btst.b    #0,(a0)        ; vol env points
  3223.     bne.s    .doenvelope
  3224.     clr.b    VolEnvOff(a6)
  3225.     clr.w    VolA(a6)
  3226.     bra.w    .noenvelope
  3227. .doenvelope
  3228.  
  3229.     btst    #0,(a0)
  3230.     beq.w    .noenvelope
  3231.  
  3232.  
  3233.     lea    6(a0),a1
  3234.     moveq    #0,d0
  3235.     moveq    #0,d1
  3236.     moveq    #0,d2
  3237.     moveq    #0,d3
  3238.     moveq    #0,d4
  3239.     moveq    #0,d5
  3240.     move.b    1(a0),d4    ; vol env points
  3241.     beq.w    .noenvelope
  3242.  
  3243. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3244.     btst    #7,VolEnvMode(a6)
  3245.     beq.s    .noback
  3246.  
  3247.     move.b    3(a0),d5    ; 1st loop point
  3248.     move.w    (a1,d5.w*4),d0
  3249.     cmp.w    VolEnvTime(a6),d0
  3250.     blt.w    .noreach1stpoint
  3251.     bclr    #7,VolEnvMode(a6)
  3252.     bra.s    .noback
  3253. .noreach1stpoint
  3254.  
  3255.     subq.w    #2,VolEnvTime(a6)
  3256. .noback
  3257.  
  3258. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3259.     addq.w    #1,VolEnvTime(a6)
  3260.  
  3261. ;-------- envelope loop -------------
  3262.  
  3263.     btst    #1,VolEnvMode(a6)
  3264.     bne.s    .noloop
  3265.  
  3266.     btst    #2,(a0)
  3267.     beq.s    .noloop
  3268.  
  3269.     move.b    4(a0),d5    ; 2nd loop point
  3270.     move.w    (a1,d5.w*4),d0
  3271.     cmp.w    VolEnvTime(a6),d0
  3272.     bgt.w    .noloop
  3273.  
  3274.     tst.b    VolEnvOff(a6)
  3275.     bne.s    .setloop
  3276.  
  3277. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3278.     tst.b    d6
  3279.     beq.s    .noping
  3280.     bset    #7,VolEnvMode(a6)
  3281.     bra.s    .noloop
  3282. .noping
  3283. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3284.  
  3285.     move.b    3(a0),d5    ; 1st loop point
  3286.     move.w    (a1,d5.w*4),VolEnvTime(a6)
  3287.     bra.s    .noloop
  3288. .setloop
  3289.     bset    #1,VolEnvMode(a6)
  3290.     tst.b    VolEnvOff(a6)
  3291.     beq.s    .noloop
  3292.     subq.b    #1,VolEnvOff(a6)
  3293. .noloop
  3294.  
  3295. ;-------- envelope sustain1 -------------
  3296.  
  3297.     btst    #0,VolEnvMode(a6)
  3298.     bne.s    .nosustain1
  3299.  
  3300.     btst    #1,(a0)
  3301.     beq.s    .nosustain1
  3302.  
  3303.     move.b    2(a0),d5    ; sustain1 point 
  3304.     move.w    (a1,d5.w*4),d0
  3305.  
  3306.     addq    #1,d0
  3307.     cmp.w    VolEnvTime(a6),d0
  3308.     bne.w    .nosustain1
  3309.  
  3310.     tst.b    VolEnvOff(a6)
  3311.     bne.s    .setsustain1
  3312.  
  3313.     move.w    (a1,d5.w*4),VolEnvTime(a6)
  3314.     bra.s    .nosustain1
  3315. .setsustain1
  3316.     bset    #0,VolEnvMode(a6)
  3317.     tst.b    VolEnvOff(a6)
  3318.     beq.s    .nosustain1
  3319.     subq.b    #1,VolEnvOff(a6)
  3320. .nosustain1
  3321.  
  3322. ;-------- envelope sustain2 -------------
  3323.  
  3324.     btst    #2,VolEnvMode(a6)
  3325.     bne.s    .nosustain2
  3326.  
  3327.     btst    #3,(a0)
  3328.     beq.s    .nosustain2
  3329.  
  3330.     move.b    5(a0),d5    ; sustain2 point
  3331.     move.w    (a1,d5.w*4),d0
  3332.  
  3333.     addq    #1,d0
  3334.     cmp.w    VolEnvTime(a6),d0
  3335.     bne.w    .nosustain2
  3336.  
  3337.     tst.b    VolEnvOff(a6)
  3338.     bne.s    .setsustain2
  3339.  
  3340.     move.w    (a1,d5.w*4),VolEnvTime(a6)
  3341.     bra.s    .nosustain2
  3342. .setsustain2
  3343.     bset    #2,VolEnvMode(a6)
  3344.     tst.b    VolEnvOff(a6)
  3345.     beq.s    .nosustain2
  3346.     subq.b    #1,VolEnvOff(a6)
  3347. .nosustain2
  3348.  
  3349. ;---------------------------------------
  3350.  
  3351.  
  3352.  
  3353. .getpoint
  3354.     move.w    (a1),d0
  3355.     cmp.w    VolEnvTime(a6),d0
  3356.     blt.s    .nextpoint
  3357.     tst.w    VolEnvTime(a6)
  3358.     beq.s    .firstpoint
  3359.     bra.s    .thispoint
  3360. .nextpoint
  3361.     addq    #4,a1
  3362.     dbf    d4,.getpoint
  3363.     subq    #1,VolEnvTime(a6)
  3364.     subq    #4,a1
  3365. .thispoint
  3366.     subq    #4,a1
  3367. .firstpoint
  3368.     move.w    (a1),d0        ; time
  3369.     move.w    4(a1),d1
  3370.  
  3371.     move.w    2(a1),d2    ; vol
  3372.     move.w    6(a1),d3
  3373.  
  3374.  
  3375.     sub.w    d2,d3
  3376.     ext.l    d3
  3377.     asl.l    #8,d3
  3378.     sub.w    d0,d1
  3379.     beq.s    .nodiv1
  3380.     divs    d1,d3
  3381. .nodiv1
  3382.     and.l    #$ffff,d3
  3383.     ext.l    d3
  3384.  
  3385.     moveq    #0,d0
  3386.     move.w    (a1),d0            ; time
  3387.     moveq    #0,d1
  3388.     move.w    VolEnvTime(a6),d1
  3389.     tst.l    d3
  3390.     bge.s    .ok1
  3391.     move.w    4(a1),d0        ; time
  3392.     moveq    #0,d5
  3393.     move.w    6(a1),d5
  3394.     lsl.w    #8,d5
  3395.     bra.s    .ok2
  3396. .ok1
  3397.     moveq    #0,d5
  3398.     move.w    2(a1),d5
  3399.     lsl.w    #8,d5
  3400. .ok2
  3401.  
  3402.     sub.w    d0,d1
  3403.     bne.s    .niezero        ; gdy rowne zero czas na envelopa
  3404.  
  3405.     btst    #1,VolEnvMode(a6)
  3406.     beq.s    .niezero
  3407.  
  3408.     move.w    6(a1),d3        ; dobiegl konca (przesyla koncowa
  3409.     lsl.w    #8,d3            ; glosnosc)
  3410.     bra.s    .envelopefinished
  3411. .niezero
  3412.     muls    d1,d3
  3413.     add.w    d5,d3
  3414. .envelopefinished
  3415.  
  3416.     moveq    #0,d4
  3417.     move.w    VolA(a6),d4
  3418.     lsr.l    #6,d4
  3419. ;    divu    #64,d4
  3420. ;    and.l    #$ffff,d4
  3421.     mulu    d3,d4
  3422.     lsr.l    #8,d4
  3423.     move.w    d4,MainVol(a6)
  3424.  
  3425.  
  3426. ;    move.l    muj,a5
  3427. ;    move.w    d4,(a5)+
  3428. ;    move.l    a5,muj
  3429.  
  3430.     moveq    #1,d7
  3431.     bra.s    .envelopedone
  3432. .noenvelope
  3433.     moveq    #0,d7
  3434. .envelopedone
  3435.     movem.l    (sp)+,d0-d6/a0-a6
  3436. ;- - - - - - - - - - - -  envelopes end
  3437.     rts
  3438.  
  3439.  
  3440.  
  3441.  
  3442.  
  3443.  
  3444.  
  3445.  
  3446.  
  3447.  
  3448. ;- - - - - - - - - - - -  envelopes    
  3449.  
  3450. ; ;;;;;;;;;;;; - procedurki do ping pong loopa
  3451.  
  3452. PanningEnvelope:
  3453.     movem.l    d0-d2/d4-d7/a0-a6,-(sp)
  3454.  
  3455.     lsr.l    #2,d1
  3456.  
  3457. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3458.     lea    LoopTab,a0
  3459.     move.b    1(a0,d1.w),d6
  3460.     lsr.b    #1,d6
  3461. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3462.  
  3463.     lea    PanEnvelope,a0
  3464.     mulu    #134,d1
  3465.     add.w    d1,a0
  3466.  
  3467.     tst.b    PanEnvOff(a6)
  3468.     beq.s    .doenvelope
  3469.     btst.b    #0,(a0)        ; Pan env points
  3470.     bne.s    .doenvelope
  3471.     clr.b    PanEnvOff(a6)
  3472.     bra.w    .noenvelope
  3473. .doenvelope
  3474.  
  3475.     btst    #0,(a0)
  3476.     beq.w    .noenvelope
  3477.  
  3478.  
  3479.     lea    6(a0),a1
  3480.     moveq    #0,d0
  3481.     moveq    #0,d1
  3482.     moveq    #0,d2
  3483.     moveq    #0,d3
  3484.     moveq    #0,d4
  3485.     moveq    #0,d5
  3486.     move.b    1(a0),d4    ; Pan env points
  3487.     beq.w    .noenvelope
  3488.  
  3489. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3490.     btst    #7,PanEnvMode(a6)
  3491.     beq.s    .noback
  3492.  
  3493.     move.b    3(a0),d5    ; 1st loop point
  3494.     move.w    (a1,d5.w*4),d0
  3495.     cmp.w    PanEnvTime(a6),d0
  3496.     blt.w    .noreach1stpoint
  3497.     bclr    #7,PanEnvMode(a6)
  3498.     bra.s    .noback
  3499. .noreach1stpoint
  3500.  
  3501.     subq.w    #2,PanEnvTime(a6)
  3502. .noback
  3503.  
  3504. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3505.     addq.w    #1,PanEnvTime(a6)
  3506.  
  3507. ;-------- envelope loop -------------
  3508.  
  3509.     btst    #1,PanEnvMode(a6)
  3510.     bne.s    .noloop
  3511.  
  3512.     btst    #2,(a0)
  3513.     beq.s    .noloop
  3514.  
  3515.     move.b    4(a0),d5    ; 2nd loop point
  3516.     move.w    (a1,d5.w*4),d0
  3517.     cmp.w    PanEnvTime(a6),d0
  3518.     bgt.w    .noloop
  3519.  
  3520.     tst.b    PanEnvOff(a6)
  3521.     bne.s    .setloop
  3522.  
  3523. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3524.     tst.b    d6
  3525.     beq.s    .noping
  3526.     bset    #7,PanEnvMode(a6)
  3527.     bra.s    .noloop
  3528. .noping
  3529. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3530.  
  3531.  
  3532.     move.b    3(a0),d5    ; 1st loop point
  3533.     move.w    (a1,d5.w*4),PanEnvTime(a6)
  3534.     bra.s    .noloop
  3535. .setloop
  3536.     bset    #1,PanEnvMode(a6)
  3537.     tst.b    PanEnvOff(a6)
  3538.     beq.s    .noloop
  3539.     subq.b    #1,PanEnvOff(a6)
  3540. .noloop
  3541.  
  3542. ;-------- envelope sustain1 -------------
  3543.  
  3544.     btst    #0,PanEnvMode(a6)
  3545.     bne.s    .nosustain1
  3546.  
  3547.     btst    #1,(a0)
  3548.     beq.s    .nosustain1
  3549.  
  3550.     move.b    2(a0),d5    ; sustain1 point 
  3551.     move.w    (a1,d5.w*4),d0
  3552.  
  3553.     addq    #1,d0
  3554.     cmp.w    PanEnvTime(a6),d0
  3555.     bne.w    .nosustain1
  3556.  
  3557.     tst.b    PanEnvOff(a6)
  3558.     bne.s    .setsustain1
  3559.  
  3560.     move.w    (a1,d5.w*4),PanEnvTime(a6)
  3561.     bra.s    .nosustain1
  3562. .setsustain1
  3563.     bset    #0,PanEnvMode(a6)
  3564.     tst.b    PanEnvOff(a6)
  3565.     beq.s    .nosustain1
  3566.     subq.b    #1,PanEnvOff(a6)
  3567. .nosustain1
  3568.  
  3569. ;-------- envelope sustain2 -------------
  3570.  
  3571.     btst    #2,PanEnvMode(a6)
  3572.     bne.s    .nosustain2
  3573.  
  3574.     btst    #3,(a0)
  3575.     beq.s    .nosustain2
  3576.  
  3577.     move.b    5(a0),d5    ; sustain2 point
  3578.     move.w    (a1,d5.w*4),d0
  3579.  
  3580.     addq    #1,d0
  3581.     cmp.w    PanEnvTime(a6),d0
  3582.     bne.w    .nosustain2
  3583.  
  3584.     tst.b    PanEnvOff(a6)
  3585.     bne.s    .setsustain2
  3586.  
  3587.     move.w    (a1,d5.w*4),PanEnvTime(a6)
  3588.     bra.s    .nosustain2
  3589. .setsustain2
  3590.     bset    #2,PanEnvMode(a6)
  3591.     tst.b    PanEnvOff(a6)
  3592.     beq.s    .nosustain2
  3593.     subq.b    #1,PanEnvOff(a6)
  3594. .nosustain2
  3595.  
  3596. ;---------------------------------------
  3597.  
  3598.  
  3599.  
  3600. .getpoint
  3601.     move.w    (a1),d0
  3602.     cmp.w    PanEnvTime(a6),d0
  3603.     blt.s    .nextpoint
  3604.     tst.w    PanEnvTime(a6)
  3605.     beq.s    .firstpoint
  3606.     bra.s    .thispoint
  3607. .nextpoint
  3608.     addq    #4,a1
  3609.     dbf    d4,.getpoint
  3610.     subq    #1,PanEnvTime(a6)
  3611.     subq    #4,a1
  3612. .thispoint
  3613.     subq    #4,a1
  3614. .firstpoint
  3615.     move.w    (a1),d0        ; time
  3616.     move.w    4(a1),d1
  3617.  
  3618.  
  3619.     move.w    2(a1),d2    ; Pan
  3620.     move.w    6(a1),d3
  3621.  
  3622.  
  3623.     sub.w    d2,d3
  3624.     ext.l    d3
  3625.     asl.l    #8,d3
  3626.     sub.w    d0,d1
  3627.     beq.s    .nodiv1
  3628.     divs    d1,d3
  3629. .nodiv1
  3630.     and.l    #$ffff,d3
  3631.     ext.l    d3
  3632.  
  3633.     moveq    #0,d0
  3634.     move.w    (a1),d0            ; time
  3635.     moveq    #0,d1
  3636.     move.w    PanEnvTime(a6),d1
  3637.     tst.l    d3
  3638.     bge.s    .ok1
  3639.     move.w    4(a1),d0        ; time
  3640.     moveq    #0,d5
  3641.     move.w    6(a1),d5
  3642.     lsl.w    #8,d5
  3643.     bra.s    .ok2
  3644. .ok1
  3645.     moveq    #0,d5
  3646.     move.w    2(a1),d5
  3647.     lsl.w    #8,d5
  3648. .ok2
  3649.  
  3650.     sub.w    d0,d1
  3651.     bne.s    .niezero        ; gdy rowne zero czas na envelopa
  3652.  
  3653.     btst    #1,PanEnvMode(a6)
  3654.     beq.s    .niezero
  3655.  
  3656.     move.w    6(a1),d3        ; dobiegl konca (przesyla koncowa
  3657.     lsl.w    #8,d3            ; glosnosc)
  3658.     bra.s    .envelopefinished
  3659. .niezero
  3660.     muls    d1,d3
  3661.     add.w    d5,d3
  3662. .envelopefinished
  3663.  
  3664.     moveq    #0,d4
  3665.     lsl.l    #2,d3
  3666.  
  3667. ;    move.l    muj,a5
  3668. ;    move.l    d3,(a5)+
  3669. ;    move.l    a5,muj
  3670.  
  3671. .noenvelope
  3672. .envelopedone
  3673.     movem.l    (sp)+,d0-d2/d4-d7/a0-a6
  3674. ;- - - - - - - - - - - -  envelopes end
  3675.     rts
  3676.  
  3677.  
  3678.  
  3679.  
  3680.  
  3681.  
  3682.  
  3683.  
  3684.  
  3685.  
  3686. ;muj:    dc.l    huj
  3687.  
  3688. ; --------------------------- EffectCommands ---------------------------
  3689.  
  3690. EffectCommandsA2:
  3691. ; effects 9xx, bxx, cxx, dxx, fxx, gxx, lxx, oxx chan A
  3692.  
  3693.     move.w    d2,d7
  3694.     beq    EffComA2exit
  3695.     lsr.w    #8,d7
  3696.     clr.b    channelenable
  3697.     move.w    d2,d3
  3698.  
  3699.     cmp.b    #8,d7
  3700.     beq    Pannings2
  3701.  
  3702.     lea    SamoffsetA(a6),a5
  3703.     cmp.b    #9,d7
  3704.     beq    SampleOffset
  3705.  
  3706.     cmp.b    #$b,d7
  3707.     beq    SongRepeat
  3708.  
  3709.     lea    VolA(a6),a5
  3710.     cmp.b    #$c,d7
  3711.     beq    SetVolume
  3712.  
  3713.     cmp.b    #$10,d7
  3714.     beq    SetGlobalVolume
  3715.  
  3716.     cmp.b    #$15,d7
  3717.     beq    SetEnvelopePos
  3718.  
  3719.     lea    Hex(pc),a5
  3720.     cmp.b    #$d,d7
  3721.     beq    PattBreak
  3722.  
  3723.     cmp.b    #$f,d7
  3724.     beq    SetTempo
  3725.  
  3726.     cmp.b    #$1c,d7
  3727.     beq    SetRealBPM
  3728.  
  3729.     cmp.b    #$1f,d7
  3730.     beq    EchoOnOff
  3731.     cmp.b    #$20,d7
  3732.     beq    SetDelay
  3733.     cmp.b    #$21,d7
  3734.     beq    SetFeedBack
  3735.     cmp.b    #$22,d7
  3736.     beq    SetMix
  3737.     cmp.b    #$23,d7
  3738.     beq    SetCross
  3739.  
  3740.     lea    OldSlideOffsetA(a6),a5
  3741.     cmp.b    #$18,d7
  3742.     beq    SlideOffset
  3743.  
  3744. ; effects E0x, E1x, E2x, E4x, E4x, E6x, E7x, E8x, EAx, EBx EEx chan A
  3745.  
  3746.     cmp.w    #$e00,d3
  3747.     beq.w    OffFilter
  3748.  
  3749.     cmp.w    #$e01,d3
  3750.     beq.w    OnFilter
  3751.  
  3752.     cmp.w    #$e50,d3
  3753.     beq.w    OffChannelA
  3754.  
  3755.     cmp.w    #$e51,d3
  3756.     beq.w    OnChannelA
  3757.  
  3758.     move.w    d2,d7
  3759.     lsr.w    #4,d7
  3760.     move.w    d2,d3
  3761.  
  3762.     cmp.b    #$e1,d7
  3763.     beq.w    FineSlideUp
  3764.  
  3765.     cmp.b    #$e2,d7
  3766.     beq.w    FineSlideDown
  3767.  
  3768.     cmp.b    #$e4,d7
  3769.     beq.w    TurnOffSam
  3770.  
  3771.     lea    loopsdataschanA(a6),a5
  3772.     cmp.b    #$e6,d7
  3773.     beq.w    Loops
  3774.  
  3775.     lea    SamOffsetA(a6),a5
  3776.     cmp.b    #$e7,d7
  3777.     beq    offsets
  3778.  
  3779.     cmp.b    #$e8,d7
  3780.     beq    pannings
  3781.  
  3782.     lea    VolA(a6),a5
  3783.     cmp.b    #$ea,d7
  3784.     beq    FineVolUp
  3785.  
  3786.     cmp.b    #$eb,d7
  3787.     beq    FineVolDown
  3788.  
  3789.     cmp.b    #$ee,d7
  3790.     beq    Pause
  3791.  
  3792. EffComA2exit
  3793.     rts
  3794.  
  3795. EffectCommandsB2:
  3796. ; effects 9xx, bxx, cxx, dxx, fxx, gxx, lxx, oxx chan B
  3797.  
  3798.     move.w    d6,d7
  3799.     beq    EffComB2exit
  3800.     lsr.w    #8,d7
  3801.     move.b    #1,channelenable
  3802.     move.w    d6,d3
  3803.  
  3804.     cmp.b    #8,d7
  3805.     beq    Pannings2
  3806.  
  3807.     lea    SamoffsetB(a6),a5
  3808.     cmp.b    #9,d7
  3809.     beq    SampleOffset
  3810.  
  3811.     cmp.b    #$b,d7
  3812.     beq    SongRepeat
  3813.  
  3814.     lea    VolA(a6),a5
  3815.     cmp.b    #$c,d7
  3816.     beq    SetVolume
  3817.  
  3818.     cmp.b    #$10,d7
  3819.     beq    SetGlobalVolume
  3820.  
  3821.     cmp.b    #$15,d7
  3822.     beq    SetEnvelopePos
  3823.  
  3824.     lea    Hex(pc),a5
  3825.     cmp.b    #$d,d7
  3826.     beq    PattBreak
  3827.  
  3828.     cmp.b    #$f,d7
  3829.     beq    SetTempo
  3830.  
  3831.     cmp.b    #$1c,d7
  3832.     beq    SetRealBPM
  3833.  
  3834.     cmp.b    #$1f,d7
  3835.     beq    EchoOnOff
  3836.     cmp.b    #$20,d7
  3837.     beq    SetDelay
  3838.     cmp.b    #$21,d7
  3839.     beq    SetFeedBack
  3840.     cmp.b    #$22,d7
  3841.     beq    SetMix
  3842.     cmp.b    #$23,d7
  3843.     beq    SetCross
  3844.  
  3845.     lea    OldSlideOffsetB(a6),a5
  3846.     cmp.b    #$18,d7
  3847.     beq    SlideOffset
  3848.  
  3849. ; effects E0x, E1x, E2x, E4x, E4x, E6x, E7x, E8x, EAx, EBx EEx chan B
  3850.  
  3851.     cmp.w    #$e00,d3
  3852.     beq.w    OffFilter
  3853.  
  3854.     cmp.w    #$e01,d3
  3855.     beq.w    OnFilter
  3856.  
  3857.     cmp.w    #$e50,d3
  3858.     beq.w    OffChannelA
  3859.  
  3860.     cmp.w    #$e51,d3
  3861.     beq.w    OnChannelA
  3862.  
  3863.     move.w    d6,d7
  3864.     lsr.w    #4,d7
  3865.     move.w    d6,d3
  3866.  
  3867.     cmp.b    #$e1,d7
  3868.     beq.w    FineSlideUp
  3869.  
  3870.     cmp.b    #$e2,d7
  3871.     beq.w    FineSlideDown
  3872.  
  3873.     cmp.b    #$e4,d7
  3874.     beq.w    TurnOffSam
  3875.  
  3876.     lea    loopsdataschanB(a6),a5
  3877.     cmp.b    #$e6,d7
  3878.     beq.w    Loops
  3879.  
  3880.     lea    SamOffsetA(a6),a5
  3881.     cmp.b    #$e7,d7
  3882.     beq    offsets
  3883.  
  3884.     cmp.b    #$e8,d7
  3885.     beq    pannings
  3886.  
  3887.     lea    VolA(a6),a5
  3888.     cmp.b    #$ea,d7
  3889.     beq    FineVolUp
  3890.  
  3891.     cmp.b    #$eb,d7
  3892.     beq    FineVolDown
  3893.  
  3894.     cmp.b    #$ee,d7
  3895.     beq    Pause
  3896.  
  3897. EffComB2exit
  3898.     rts
  3899.  
  3900.  
  3901.  
  3902.  
  3903. EffectCommandsA:
  3904. ; effects 0xx 1xx, 2xx, 3xx, 4xx, 5xx, 6xx, axx, hxx chan A
  3905.     move.w    d2,d7
  3906.     beq    EffComAexit
  3907.     lsr.w    #8,d7
  3908.     clr.b    channelenable
  3909.     move.w    d2,d3
  3910.  
  3911.     lea    OrgPeriodARP(a6),a5
  3912.     tst.b    d7
  3913.     beq.w    Arpeggio
  3914.  
  3915.     cmp.b    #1,d7
  3916.     beq.w    PortUp
  3917.  
  3918.     cmp.b    #2,d7
  3919.     beq.w    PortDown
  3920.  
  3921.     lea    GlissandoDatasA(a6),a5
  3922.     cmp.b    #3,d7
  3923.     beq.w    Glissando
  3924.  
  3925.     lea    VibratoDatasA(a6),a5
  3926.     cmp.b    #4,d7
  3927.     beq.w    Vibrato
  3928.  
  3929.     cmp.b    #5,d7
  3930.     beq.w    SlideVolGliss
  3931.  
  3932.     cmp.b    #6,d7
  3933.     beq.w    SlideVolVib
  3934.  
  3935.     lea    VolA(a6),a5
  3936.     cmp.b    #$a,d7
  3937.     beq    SlideVolume
  3938.  
  3939.     lea    OldGlobalVolA(a6),a5
  3940.     cmp.b    #$11,d7
  3941.     beq    SlideGlobalVolume
  3942.  
  3943.     lea    SlidePanOldA(a6),a5
  3944.     cmp.b    #$19,d7
  3945.     beq    SlidePan
  3946.  
  3947. ; effects E9x, ECx EDx chan A
  3948.  
  3949.     move.w    d2,d7
  3950.     lsr.w    #4,d7
  3951.     move.w    d2,d3
  3952.  
  3953.     lea    RetraceCntA(a6),a5
  3954.     cmp.b    #$e9,d7
  3955.     beq.w    Retrace
  3956.  
  3957.     lea    VolA(a6),a5
  3958.     cmp.b    #$ec,d7
  3959.     beq    CutSample
  3960.  
  3961.     lea    NoteDelayPeriodA(a6),a5
  3962.     cmp.b    #$ed,d7
  3963.     beq    DelaySample
  3964. EffComAexit
  3965.     rts
  3966.  
  3967.  
  3968. EffectCommandsB:
  3969. ; effects 1xx, 2xx, 3xx, 4xx, 5xx, 6xx, axx, hxx chan B
  3970.     move.w    d6,d7
  3971.     beq    EffComBexit
  3972.     lsr.w    #8,d7
  3973.     move.b    #1,channelenable
  3974.     move.w    d6,d3
  3975.  
  3976.     lea    OrgPeriodARP(a6),a5
  3977.     tst.b    d7
  3978.     beq.w    Arpeggio
  3979.  
  3980.     cmp.b    #1,d7
  3981.     beq.w    PortUp
  3982.  
  3983.     cmp.b    #2,d7
  3984.     beq.w    PortDown
  3985.  
  3986.     lea    GlissandoDatasB(a6),a5
  3987.     cmp.b    #3,d7
  3988.     beq.w    Glissando
  3989.  
  3990.     lea    VibratoDatasB(a6),a5
  3991.     cmp.b    #4,d7
  3992.     beq.w    Vibrato
  3993.  
  3994.     cmp.b    #5,d7
  3995.     beq.w    SlideVolGliss
  3996.  
  3997.     cmp.b    #6,d7
  3998.     beq.w    SlideVolVib
  3999.  
  4000.     lea    VolB(a6),a5    ; musi byc B
  4001.     cmp.b    #$a,d7
  4002.     beq    SlideVolume
  4003.  
  4004.     lea    OldGlobalVolB(a6),a5
  4005.     cmp.b    #$11,d7
  4006.     beq    SlideGlobalVolume
  4007.  
  4008.     lea    SlidePanOldB(a6),a5
  4009.     cmp.b    #$19,d7
  4010.     beq    SlidePan
  4011.  
  4012. ; effects E9x, ECx, EDx chan B
  4013.  
  4014.     move.w    d6,d7
  4015.     lsr.w    #4,d7
  4016.     move.w    d6,d3
  4017.  
  4018.     lea    RetraceCntB(a6),a5
  4019.     cmp.b    #$e9,d7
  4020.     beq.w    Retrace
  4021.  
  4022.     lea    VolA(a6),a5
  4023.     cmp.b    #$ec,d7
  4024.     beq    CutSample
  4025.  
  4026.     lea    NoteDelayPeriodB(a6),a5
  4027.     cmp.b    #$ed,d7
  4028.     beq    DelaySample
  4029. EffComBexit
  4030.     rts
  4031.  
  4032. ;------------------------------ effects -------------------------------------
  4033. TurnOffSam:
  4034.     move.b    #1,OffEnable(a6)
  4035.     rts
  4036.  
  4037. SetEnvelopePos:
  4038.     moveq    #0,d7
  4039.     move.b    d3,d7
  4040.     move.w    d7,VolEnvTime(a6)
  4041.     moveq    #0,d3
  4042.     rts
  4043.  
  4044.  
  4045. ;looppattpos    (a5)      0OFS
  4046. ;loopsongpos    1(a5)     1OFS
  4047. ;loophowmany    2(a5)     2OFS
  4048.  
  4049. _0OFS    equ    0
  4050. _1OFS    equ    2
  4051. _2OFS    equ    1
  4052.  
  4053. loops:
  4054.     cmp.w    #$e60,d3
  4055.     bne.s    no_loop
  4056.     tst.b    _2OFS(a5)
  4057.     bne.s    loops_done
  4058.     moveq    #0,d7
  4059.     move.w    pattpos(pc),d7
  4060.     move.b    d7,(a5)
  4061.  
  4062.     move.w    songpos(pc),_1OFS(a5)
  4063.  
  4064.     bra.s    loops_done
  4065. no_loop
  4066.     tst.b    _2OFS(a5)
  4067.     beq.s    storehowmany
  4068.     subq.b    #1,_2OFS(a5)
  4069.     bne.s    no_done
  4070.     clr.b    (a5)
  4071.     clr.w    _1OFS(a5)
  4072.     clr.b    _2OFS(a5)
  4073.     bra.s    loops_done
  4074. no_done
  4075.     moveq    #0,d7
  4076.     move.b    (a5),d7
  4077.     subq.w    #1,d7
  4078.     move.w    d7,PattPos
  4079.  
  4080.     move.w    _1OFS(a5),songpos
  4081.     bra.s    loops_done
  4082. storehowmany
  4083.     and.b    #$0f,d3
  4084.     move.b    d3,_2OFS(a5)
  4085.  
  4086.     moveq    #0,d7
  4087.     move.b    (a5),d7
  4088.     subq.w    #1,d7
  4089.     move.w    d7,PattPos
  4090.  
  4091.     move.w    _1OFS(a5),songpos
  4092. loops_done
  4093.     rts
  4094.  
  4095. Pause:
  4096.     tst.b    PauseEn
  4097.     bne.s    no_pause
  4098.  
  4099.     moveq    #0,d7
  4100.     move.b    d3,d7
  4101.     and.b    #$0f,d7
  4102.     beq.s    No_pause
  4103.     moveq    #0,d3
  4104.     move.b    Temp(pc),d3
  4105.     mulu    d3,d7
  4106.     addq.w    #1,d7
  4107.     move.w    d7,PauseVBL
  4108. no_pause
  4109.     rts
  4110.  
  4111. SongRepeat:
  4112.     move.w    #-1,pattpos
  4113.     moveq    #0,d7
  4114.     move.b    d3,d7
  4115.     cmp.w    #1024,d7
  4116.     blt.s    songrep_ok
  4117.     move.w    #1024,d7
  4118. songrep_ok
  4119.     move.w    d7,songpos
  4120.     rts
  4121.  
  4122. PattBreak:
  4123.     moveq    #0,d7
  4124.     move.b    d3,d7
  4125.     cmp.w    #99,d7
  4126.     blt.s    patt_ok
  4127.     move.w    #99,d7
  4128. patt_ok
  4129.     cmp.w    #-1,pattpos
  4130.     beq.s    NoAddSP
  4131.     move.l    d0,-(sp)
  4132.     moveq    #0,d0
  4133.     move.w    OrdNum,d0
  4134.     cmp.w    SongPos,d0
  4135.     bne.s    .skip1
  4136.     clr.w    SongPos
  4137.     bra.s    .skip2
  4138. .skip1
  4139.     addq.w    #1,songpos
  4140. .skip2
  4141.     move.l    (sp)+,d0
  4142. NoAddSP
  4143.     move.l    d0,-(sp)
  4144.     moveq    #0,d0
  4145.     move.b    (a5,d7.w),d0
  4146.     move.w    d0,pattpos
  4147.     subq.w    #1,pattpos
  4148.     move.l    (sp)+,d0
  4149.     rts
  4150.  
  4151. SampleOffset:
  4152.     tst.b    d3
  4153.     bne.w    .nozero
  4154.  
  4155. .nozero
  4156.     moveq    #0,d7
  4157.     move.b    (a5),d7
  4158.     lsl.w    #8,d7
  4159.     lsl.l    #8,d7
  4160.     and.w    #$00ff,d3
  4161.     lsl.w    #8,d3
  4162.     add.w    d3,d7
  4163.     tst.b    channelenable
  4164.     bne.s    SamOffsChanB
  4165. ;    add.l    d7,(a2,d1.w)
  4166.     rts
  4167. SamOffsChanB
  4168. ;    add.l    d7,124(a2,d5.w)
  4169.     rts
  4170.  
  4171.  
  4172. offsets:
  4173.     move.b    d3,d7
  4174.     and.b    #$0f,d7
  4175.     move.b    d7,(a5)
  4176.     rts
  4177.  
  4178.  
  4179.  
  4180. pannings:
  4181.     moveq    #0,d7
  4182.     move.b    d3,d7
  4183.     and.b    #$0f,d7
  4184.     mulu    #17,d7
  4185.     lea    GeneralPan(a6),a5
  4186.     move.w    d7,(a5)
  4187.     rts
  4188.  
  4189. pannings2:
  4190.     moveq    #0,d7
  4191.     move.b    d3,d7
  4192.     lea    GeneralPan(a6),a5
  4193.     move.w    d7,(a5)
  4194.     rts
  4195.  
  4196. SlidePan:
  4197.     tst.b    d3
  4198.     bne.s    .NoOldSlidePan
  4199.     move.b    (a5),d3
  4200. .NoOldSlidePan
  4201.     move.b    d3,(a5)
  4202.  
  4203.     moveq    #0,d7
  4204.     move.b    d3,d7
  4205.     cmp.w    #$10,d7
  4206.     blt.s    Pandown
  4207.  
  4208.     lsr.b    #4,d7
  4209.     add.w    d7,GeneralPan(a6)
  4210.     cmp.w    #256,GeneralPan(a6)
  4211.     blt.s    Pandone
  4212.     move.w    #256,GeneralPan(a6)
  4213.     rts
  4214. PanDown
  4215.     sub.w    d7,GeneralPan(a6)
  4216.     tst.w    GeneralPan(a6)
  4217.     bgt.s    Pandone
  4218.     clr.w    GeneralPan(a6)
  4219. Pandone:rts
  4220.  
  4221.  
  4222.  
  4223. SetTempo:
  4224.     moveq    #0,d7
  4225.     move.b    d3,d7
  4226.     tst.w    d7
  4227.     beq.s    .Set
  4228.     cmp.w    #$1f,d7
  4229.     bgt.w    Cia_temp
  4230. .Set
  4231.     move.b    d3,temp
  4232.     move.b    d3,orgtemp
  4233.     move.b    d3,count
  4234.     rts
  4235.  
  4236.  
  4237. SetRealBPM:
  4238.     moveq    #0,d7
  4239.     move.b    d3,d7
  4240.  
  4241.     cmp.w    #$20,d7
  4242.     bge.s    .ok
  4243.     moveq    #$20,d7
  4244. .ok
  4245.  
  4246.     move.w    d7,RealTempo
  4247.  
  4248.     moveq    #0,d7
  4249.     move.w    CiaTempo,d7
  4250.     bsr.w    SetAhiTempo
  4251.  
  4252. ;    move.w    #1,RefreshSlider6en
  4253.     rts
  4254.  
  4255. EchoOnOff
  4256.     cmp.w    #$1f10,d3
  4257.     beq.s    EchoOnAll
  4258.     cmp.w    #$1f11,d3
  4259.     beq.s    EchoOffAll
  4260.     lea    mask1channels+2-1,a5
  4261.     add.w    WhichChan,a5
  4262.  
  4263.     moveq    #0,d7
  4264.     move.b    d3,d7
  4265.  
  4266.     cmp.l    #1,d7
  4267.     bgt.s    .exit
  4268.  
  4269.     cmp.b    (a5),d7
  4270.     beq.s    .exit
  4271.     move.b    d7,(a5)
  4272.     move.w    #1,EchoEn
  4273. .exit
  4274.     rts
  4275.  
  4276.  
  4277. EchoOnAll:
  4278.     lea    mask1channels+2,a5
  4279.     move.l    ahi_chan,d7
  4280.     subq    #1,d7
  4281. .test
  4282.     cmp.b    #AHIEDM_WET,(a5)+
  4283.     beq.s    .niemam
  4284.     move.w    #1,EchoEn
  4285.     move.b    #AHIEDM_WET,-1(a5)
  4286. .niemam
  4287.     dbf    d7,.test
  4288.     rts
  4289.  
  4290. EchoOffAll:
  4291.     lea    mask1channels+2,a5
  4292.     move.l    ahi_chan,d7
  4293.     subq    #1,d7
  4294. .test
  4295.     cmp.b    #AHIEDM_DRY,(a5)+
  4296.     beq.s    .niemam
  4297.     move.w    #1,EchoEn
  4298.     move.b    #AHIEDM_DRY,-1(a5)
  4299. .niemam
  4300.     dbf    d7,.test
  4301.     rts
  4302.  
  4303. SetDelay:
  4304.     moveq    #0,d7
  4305.     move.b    d3,d7
  4306.  
  4307.     move.w    d7,DSPparamtab
  4308.  
  4309. ;    move.w    #1,DSPEchoSignal
  4310.  
  4311.     move.l    Ahi_freq,d7
  4312.     lsl.l    #8,d7
  4313.     divu    #500,d7
  4314.     and.l    #$ffff,d7
  4315.  
  4316.     move.l    d6,-(sp)
  4317.     moveq    #0,d6
  4318.     move.b    d3,d6
  4319.     mulu    d6,d7
  4320.     lsr.l    #8,d7
  4321.     cmp.l    DSPECHODELAY,d7
  4322.     beq.s    .exit
  4323.     move.l    d7,DSPECHODELAY
  4324.     move.w    #1,EchoEn
  4325. .exit
  4326.     move.l    (sp)+,d6
  4327. .skip
  4328.     rts
  4329.  
  4330.  
  4331.  
  4332. SetFeedBack:
  4333.     moveq    #0,d7
  4334.     move.b    d3,d7
  4335.  
  4336.     move.w    d7,DSPparamtab+2
  4337. ;    move.w    #1,DSPEchoSignal
  4338.  
  4339.     mulu    #257,d7
  4340.     cmp.l    #$ffff,d7
  4341.     bne.s    .noffff
  4342.     addq.l    #1,d7
  4343. .noffff
  4344.     cmp.l    DSPECHOFEEDBACK,d7
  4345.     beq.s    .exit
  4346.     move.l    d7,DSPECHOFEEDBACK
  4347.     move.w    #1,EchoEn
  4348. .exit
  4349.     rts
  4350.  
  4351.  
  4352.  
  4353.  
  4354. SetMix:
  4355.     moveq    #0,d7
  4356.     move.b    d3,d7
  4357.  
  4358.     move.w    d7,DSPparamtab+4
  4359. ;    move.w    #1,DSPEchoSignal
  4360.  
  4361.     mulu    #257,d7
  4362.     cmp.l    #$ffff,d7
  4363.     bne.s    .noffff
  4364.     addq.l    #1,d7
  4365. .noffff
  4366.     cmp.l    DSPECHOMIX,d7
  4367.     beq.s    .exit
  4368.     move.l    d7,DSPECHOMIX
  4369.     move.w    #1,EchoEn
  4370. .exit
  4371.     rts
  4372.  
  4373.  
  4374.  
  4375.  
  4376. SetCross:
  4377.     moveq    #0,d7
  4378.     move.b    d3,d7
  4379.  
  4380.     move.w    d7,DSPparamtab+6
  4381. ;    move.w    #1,DSPEchoSignal
  4382.  
  4383.     mulu    #257,d7
  4384.     cmp.l    #$ffff,d7
  4385.     bne.s    .noffff
  4386.     addq.l    #1,d7
  4387. .noffff
  4388.     cmp.l    DSPECHOCROSS,d7
  4389.     beq.s    .exit
  4390.     move.l    d7,DSPECHOCROSS
  4391.     move.w    #1,EchoEn
  4392. .exit
  4393.     rts
  4394.  
  4395.  
  4396.  
  4397.  
  4398.  
  4399. Cia_temp
  4400.  
  4401. SetAHItempo:
  4402.     move.w    d7,CiaTempo
  4403.  
  4404.  
  4405.     movem.l    d0-d6/a0-a6,-(sp)
  4406.     moveq    #0,d0
  4407.     moveq    #0,d1
  4408.     move.w    RealTempo,d0
  4409.     move.w    d7,d1
  4410.     lsl.l    #8,d0
  4411.     divu    #125,d0
  4412.     and.l    #$ffff,d0
  4413.     mulu    d0,d1
  4414.     lsr.l    #8,d1
  4415.     move.w    d1,d7
  4416.     move.w    d7,RealCiaTempo
  4417.     movem.l    (sp)+,d0-d6/a0-a6
  4418.  
  4419.  
  4420.     and.l    #$ffff,d7
  4421.     lsl.w    #1,d7
  4422.     divu    #5,d7
  4423.     and.l    #$ffff,d7
  4424.     swap    d7
  4425.     move.l    d7,afreq
  4426.  
  4427.     movem.l    d0-a6,-(sp)
  4428.     move.l    ahibase(pc),a6
  4429.     lea    atags(pc),a1
  4430.     move.l    ahi_ctrl(pc),a2
  4431.     jsr    _LVOAHI_ControlAudioA(a6)
  4432.     movem.l    (sp)+,d0-a6
  4433.     rts
  4434. atags
  4435.     dc.l    AHIA_PlayerFreq
  4436. afreq    dc.l    50<<16
  4437.     dc.l    TAG_DONE
  4438.  
  4439.  
  4440. OffChannelA:
  4441.     bset    #0,OnOffChanA(a6)
  4442.     rts
  4443. OnChannelA:
  4444.     bclr    #0,OnOffChanA(a6)
  4445.     rts
  4446. OffChannelB:
  4447.     bset    #0,OnOffChanB(a6)
  4448.     rts
  4449. OnChannelB:
  4450.     bclr    #0,OnOffChanB(a6)
  4451.     rts
  4452.  
  4453. OffFilter:
  4454.     bclr    #1,$bfe001
  4455.     rts
  4456. OnFilter:
  4457.     bset    #1,$bfe001
  4458.     rts
  4459.  
  4460.  
  4461.  
  4462. Retrace:
  4463.     cmp.b    #1,count
  4464.     bne.s    retrno_2
  4465.     clr.b    (a5)
  4466. retrno_2
  4467.     moveq    #0,d7
  4468.     move.b    d3,d7
  4469.     and.b    #$0f,d7
  4470.     subq.b    #1,d7
  4471.     cmp.b    (a5),d7
  4472.     bne.s    retrno_1
  4473.  
  4474.     tst.b    channelenable
  4475.     beq.s    retr_chan_a
  4476. ;    move.l    (a0,d5.w),124(a2,d5.w)    ; adres sampla
  4477.     move.b    #1,OffEnable(a6)
  4478.     bra.s    retr_chan_b
  4479. retr_chan_a
  4480.     move.b    #1,OffEnable(a6)
  4481. ;    move.l    (a0,d1.w),(a2,d1.w)    ; adres sampla
  4482. retr_chan_b
  4483.     clr.b    (a5)
  4484.     rts
  4485. retrno_1
  4486.     addq.b    #1,(a5)
  4487. no_retrace_1
  4488.     rts
  4489.  
  4490. cutsample:
  4491.     moveq    #0,d7
  4492.     move.b    d3,d7
  4493.     and.b    #$0f,d7
  4494.     beq.s    .doit
  4495.     cmp.b    count(pc),d7
  4496.     bne.s    no_cut_sam
  4497.  
  4498.  
  4499.     moveq    #0,d7
  4500.     move.b    count,d7
  4501.     cmp.b    temp(pc),d7
  4502.     beq.s    no_cut_sam
  4503.  
  4504. .doit    clr.w    (a5)
  4505. no_cut_sam:
  4506.     rts
  4507.  
  4508.  
  4509. delaysample:
  4510.     moveq    #0,d7
  4511.     move.b    d3,d7
  4512.     and.b    #$0f,d7
  4513.     beq.s    no_delay_sam
  4514.  
  4515.     clr.b    OffEnable(a6)
  4516.  
  4517.     moveq    #0,d7
  4518.     move.b    count2,d7
  4519.     bne.s    .nostore
  4520.     move.w    d0,(a5)
  4521.     move.w    d1,2(a5)
  4522. .nostore
  4523.     move.w    OldD0(a6),d0
  4524.     move.w    OldD1(a6),d1
  4525.  
  4526.     moveq    #0,d7
  4527.     move.b    d3,d7
  4528.     and.b    #$0f,d7
  4529.  
  4530.     cmp.b    count2(pc),d7
  4531.     bne.s    no_delay_sam
  4532.     move.w    (a5),d0
  4533.     move.w    2(a5),d1
  4534.     clr.w    OldPeriod(a6)
  4535.     move.b    #1,OffEnable(a6)
  4536.  
  4537.     clr.b    VolEnvOff(a6)
  4538.     clr.b    VolEnvMode(a6)
  4539.     clr.w    VolEnvTime(a6)
  4540. no_delay_sam:
  4541.     rts
  4542.  
  4543. ; ------------- arpeggio -------------
  4544. arplist:
  4545.     dc.b 0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1
  4546. Arpeggio:
  4547.     movem.l    d2/a6,-(sp)
  4548.     bsr    ArpeggioMain
  4549.     movem.l    (sp)+,d2/a6
  4550.     move.l    d1,d7
  4551.     lsr.w    #1,d7
  4552.     addq    #2,d7
  4553.     bsr    FINETUNES
  4554.  
  4555.     move.w    d0,VibratoDatasA(a6)
  4556.     move.w    d0,VibratoDatasB(a6)
  4557.     rts
  4558.  
  4559. ArpeggioMain:
  4560.     moveq    #0,d7
  4561.     move.b    count(pc),d7
  4562.     subq.b    #1,d7
  4563.  
  4564.     move.b    arplist(pc,d7.w),d7
  4565.     beq.s    arp0
  4566.     cmp.b    #2,d7
  4567.     beq.s    arp2
  4568.  
  4569. arp1:    moveq    #0,d2
  4570.     move.b    d3,d2
  4571.     lsr.b    #4,d2
  4572.     bra.s    arpdo
  4573.  
  4574. arp2:    moveq    #0,d2
  4575.     move.b    d3,d2
  4576.     and.b    #$f,d2
  4577. arpdo:
  4578.     asl.w    #1,d2
  4579.     move.w    (a5),d7
  4580.     lea    periods,a6
  4581.     moveq    #12*7,d3
  4582. arp3:    cmp.w    (a6)+,d7
  4583.     bge.s    arpfound
  4584.     dbf    d3,arp3
  4585. arp0:
  4586.     tst.b    channelenable
  4587.     bne.s    ARP_chanB1
  4588.     move.w    (a5),d0
  4589.     rts
  4590. ARP_chanB1
  4591.     move.w    (a5),d0
  4592.     rts
  4593. arpfound:
  4594.     add.w    d2,a6
  4595.     cmp.l    #PeriodsEnd,a6
  4596.     ble.s    ArpOk1
  4597.     move.l    #PeriodsEnd,a6
  4598.     moveq    #0,d2
  4599.     bra.s    ArpOk2
  4600. ArpOk1    sub.w    d2,a6
  4601. ArpOk2    tst.b    channelenable
  4602.     bne.s    ARP_chanB2
  4603.     move.w    -2(a6,d2.w),d0
  4604.     rts
  4605. ARP_chanB2
  4606.     move.w    -2(a6,d2.w),d0
  4607.     rts
  4608.  
  4609. ; ------------- portamento up -------------
  4610.  
  4611. PortUp:
  4612.     moveq    #0,d7
  4613.     move.b    d3,d7
  4614.  
  4615.     tst.b    channelenable
  4616.     bne.s    PortUp_chan_b
  4617.     
  4618. PortUp_chan_a
  4619.     tst.b    d7
  4620.     bne.s    NoOldPortUpA
  4621.     move.b    PortUpOldValA(a6),d7
  4622. NoOldPortUpA
  4623.     move.b    d7,PortUpOldValA(a6)
  4624.  
  4625.     move.b    d7,d3
  4626.     and.b    #$f0,d7
  4627.     cmp.b    #$f0,d7
  4628.     beq.w    FineSU
  4629.     move.b    d3,d7
  4630.  
  4631.     lsl.w    #2,d7
  4632.     sub.w    d7,d0
  4633. ;    cmp.w    #113,d0
  4634. ;    bge.s    PortUpOkA
  4635. ;    move.w    #113,d0
  4636. ;PortUpOkA
  4637.     move.w    d0,VibratoDatasA(a6)
  4638.     move.w    d0,VibratoDatasB(a6)
  4639.     rts
  4640.  
  4641. PortUp_chan_b
  4642.     tst.b    d7
  4643.     bne.s    NoOldPortUpB
  4644.     move.b    PortUpOldValB(a6),d7
  4645. NoOldPortUpB
  4646.     move.b    d7,PortUpOldValB(a6)
  4647.     move.b    d7,d3
  4648.     and.b    #$f0,d7
  4649.     cmp.b    #$f0,d7
  4650.     beq.w    FineSU
  4651.     move.b    d3,d7
  4652.  
  4653.     lsl.w    #2,d7
  4654.     sub.w    d7,d0
  4655.  
  4656. ;    cmp.w    #113,d0
  4657. ;    bge.s    PortUpOkB
  4658. ;    move.w    #113,d0
  4659. ;PortUpOkB
  4660. ;    rts
  4661.  
  4662.     move.w    d0,VibratoDatasA(a6)
  4663.     move.w    d0,VibratoDatasB(a6)
  4664. NoPortUp:
  4665.     rts
  4666.  
  4667. ; ------------- portamento down -------------
  4668. PortDown:
  4669.     moveq    #0,d7
  4670.     move.b    d3,d7
  4671.  
  4672.     tst.b    channelenable
  4673.     bne.s    PortDown_chan_b
  4674. PortDown_chan_a
  4675.     tst.b    d7
  4676.     bne.s    NoOldPortDownA
  4677.     move.b    PortDownOldValA(a6),d7
  4678. NoOldPortDownA
  4679.     move.b    d7,PortDownOldValA(a6)
  4680.     move.b    d7,d3
  4681.     and.b    #$f0,d7
  4682.     cmp.b    #$f0,d7
  4683.     beq.w    FineSD
  4684.     move.b    d3,d7
  4685.  
  4686.     lsl.w    #2,d7
  4687.     add.w    d7,d0
  4688. ;    cmp.w    #856,d0
  4689. ;    ble.s    PortDownOkA
  4690. ;    move.w    #856,d0
  4691. ;PortDownOkA
  4692.     move.w    d0,VibratoDatasA(a6)
  4693.     move.w    d0,VibratoDatasB(a6)
  4694.     rts
  4695.  
  4696. PortDown_chan_b
  4697.     tst.b    d7
  4698.     bne.s    NoOldPortDownB
  4699.     move.b    PortDownOldValB(a6),d7
  4700. NoOldPortDownB
  4701.     move.b    d7,PortDownOldValB(a6)
  4702.     move.b    d7,d3
  4703.     and.b    #$f0,d7
  4704.     cmp.b    #$f0,d7
  4705.     beq.w    FineSD
  4706.     move.b    d3,d7
  4707.  
  4708.     lsl.w    #2,d7
  4709.     add.w    d7,d0
  4710. ;    cmp.w    #856,d0
  4711. ;    ble.s    PortDownOkB
  4712. ;    move.w    #856,d0
  4713. ;PortDownOkB
  4714.     move.w    d0,VibratoDatasA(a6)
  4715.     move.w    d0,VibratoDatasB(a6)
  4716. noPortDown:
  4717.     rts
  4718.  
  4719. ; --------------- set global volume  -------------
  4720. SetGlobalVolume:
  4721.     moveq    #0,d7
  4722.     move.b    d3,d7
  4723.     move.w    d7,GlobalVol
  4724.     rts
  4725. ; ------------- slide global volume  -------------
  4726. SlideGlobalVolume:
  4727.     tst.b    d3
  4728.     bne.s    .NoOldSlideVol
  4729.     move.b    (a5),d3    ; Old SlideVolValue
  4730. .NoOldSlideVol
  4731.     move.b    d3,(a5)
  4732.  
  4733.     moveq    #0,d7
  4734.     move.b    d3,d7
  4735.     cmp.w    #$10,d7
  4736.     blt.s    .Voldown
  4737.  
  4738.     moveq    #0,d7
  4739.     move.b    d3,d7
  4740.     lsr.b    #4,d7
  4741.     add.w    d7,GlobalVol
  4742.     cmp.w    #64,GlobalVol
  4743.     blt.s    .Voldone
  4744.     move.w    #64,GlobalVol
  4745.     rts
  4746. .Voldown
  4747.     moveq    #0,d7
  4748.     move.b    d3,d7
  4749.     sub.w    d7,GlobalVol
  4750.     tst.w    GlobalVol
  4751.     bgt.s    .Voldone
  4752.     clr.w    GlobalVol
  4753. .Voldone:
  4754.     rts
  4755.  
  4756. ; ------------- slide offset -------------
  4757. SlideOffset:
  4758.     tst.b    d3
  4759.     bne.s    .NoOldSlide
  4760.     move.b    (a5),d3    ; Old SlideOffset
  4761. .NoOldSlide
  4762.     move.b    d3,(a5)
  4763.  
  4764.     moveq    #0,d7
  4765.     move.b    d3,d7
  4766.     cmp.w    #$10,d7
  4767.     blt.s    .down
  4768.  
  4769.     moveq    #0,d7
  4770.     move.b    d3,d7
  4771.     lsr.b    #4,d7
  4772.     add.w    d7,SlideSamOffset(a6)
  4773.     rts
  4774. .down
  4775.     moveq    #0,d7
  4776.     move.b    d3,d7
  4777.     sub.w    d7,SlideSamOffset(a6)
  4778.     tst.w    SlideSamOffset(a6)
  4779.     bgt.s    .done
  4780.     clr.w    SlideSamOffset(a6)
  4781. .done:
  4782.     rts
  4783.  
  4784. ; --------------- set volume  -------------
  4785. SetVolume:
  4786.     moveq    #0,d7
  4787.     move.b    d3,d7
  4788.     lsl.w    #8,d7
  4789.     move.w    d7,(a5)
  4790.     rts
  4791.  
  4792. ; --------------- slide volume up -------------
  4793. SlideVolume:
  4794.     tst.b    d3
  4795.     bne.s    NoOldSlideVol
  4796.     move.b    2(a5),d3    ; Old SlideVolVolue
  4797. NoOldSlideVol
  4798.     move.b    d3,2(a5)
  4799.  
  4800.     moveq    #0,d7
  4801.     move.b    d3,d7
  4802.     cmp.w    #$10,d7
  4803.     blt.s    Voldown
  4804.  
  4805.     and.b    #$0f,d7
  4806.     cmp.b    #$0f,d7
  4807.     beq.s    FineVol
  4808.     move.b    d3,d7
  4809.     and.b    #$f0,d7
  4810.     cmp.b    #$f0,d7
  4811.     beq.s    FineVol
  4812.  
  4813.     moveq    #0,d7
  4814.     move.b    d3,d7
  4815.     lsr.b    #4,d7
  4816.     lsl.w    #8,d7
  4817.     add.w    d7,VolA(a6)
  4818.     cmp.w    #64*256,VolA(a6)
  4819.     blt.s    Voldone
  4820.     move.w    #64*256,VolA(a6)
  4821.     rts
  4822. Voldown
  4823. ;    and.b    #$f0,d7
  4824.  
  4825.     moveq    #0,d7
  4826.     move.b    d3,d7
  4827.     lsl.w    #8,d7
  4828.     sub.w    d7,VolA(a6)
  4829.     tst.w    VolA(a6)
  4830.     bgt.s    Voldone
  4831.     clr.w    VolA(a6)
  4832. Voldone:rts
  4833.  
  4834.  
  4835. FineVol:
  4836.     cmp.b    #$0f,d7
  4837.     beq.s    .FineUp
  4838.     moveq    #0,d7
  4839.     move.b    d3,d7
  4840.     and.b    #$0f,d7
  4841.     add.w    #$eb0,d7
  4842.     move.w    d7,d3
  4843.     bsr    FineVolDown
  4844.     rts
  4845. .FineUp:
  4846.     moveq    #0,d7
  4847.     move.b    d3,d7
  4848.     lsr.b    #4,d7
  4849.     add.w    #$ea0,d7
  4850.     move.w    d7,d3
  4851.     bsr    FineVolUp
  4852.     rts
  4853.  
  4854. FineSU:
  4855.     moveq    #0,d7
  4856.     move.b    d3,d7
  4857.     and.b    #$0f,d7
  4858. ;    add.w    #$ea0,d7
  4859.     move.w    d7,d3
  4860.     bsr    FineSlideUp
  4861.     rts
  4862. FineSD:
  4863.     moveq    #0,d7
  4864.     move.b    d3,d7
  4865.     and.b    #$0f,d7
  4866. ;    add.w    #$eb0,d7
  4867.     move.w    d7,d3
  4868.     bsr    FineSlideDown
  4869.     rts
  4870.  
  4871.  
  4872. ; --------------- fine slide down -------------
  4873. FineSlideDown:
  4874.     move.w    d3,d7
  4875.     and.w    #$000f,d7
  4876.     lsl.w    #2,d7
  4877.  
  4878.     tst.b    channelenable
  4879.     bne.s    FineSlideDownB
  4880.  
  4881.     add.w    d7,d0
  4882. ;    cmp.w    #856,d0
  4883. ;    ble.s    FineSlideDownOkA
  4884. ;    move.w    #856,d0
  4885. ;FineSlideDownOkA
  4886.     moveq    #0,d2
  4887.  
  4888.     move.w    d0,VibratoDatasA(a6)
  4889.     move.w    d0,VibratoDatasB(a6)
  4890.     rts
  4891.  
  4892. FineSlideDownB
  4893.     add.w    d7,d0
  4894. ;    cmp.w    #856,d0
  4895. ;    ble.s    FineSlideDownOkB
  4896. ;    move.w    #856,d0
  4897. ;FineSlideDownOkB
  4898.     moveq    #0,d6
  4899.     move.w    d0,VibratoDatasA(a6)
  4900.     move.w    d0,VibratoDatasB(a6)
  4901.     rts
  4902.  
  4903. ; --------------- fine slide up -------------
  4904. FineSlideUp:
  4905.     move.w    d3,d7
  4906.     and.w    #$000f,d7
  4907.     lsl.w    #2,d7
  4908.  
  4909.     tst.b    channelenable
  4910.     bne.s    FineSlideUpB
  4911.  
  4912.     sub.w    d7,d0
  4913. ;    cmp.w    #113,d0
  4914. ;    bge.s    FineSlideUpOkA
  4915. ;    move.w    #113,d0
  4916. ;FineSlideUpOkA
  4917.     moveq    #0,d2
  4918.     move.w    d0,VibratoDatasA(a6)
  4919.     move.w    d0,VibratoDatasB(a6)
  4920.     rts
  4921.  
  4922. FineSlideUpB
  4923.     sub.w    d7,d0
  4924.  
  4925. ;    cmp.w    #113,d0
  4926. ;    bge.s    FineSlideUpOkB
  4927. ;    move.w    #113,d0
  4928. ;FineSlideUpOkB
  4929.     moveq    #0,d6
  4930.     move.w    d0,VibratoDatasA(a6)
  4931.     move.w    d0,VibratoDatasB(a6)
  4932.     rts
  4933.  
  4934. ; --------------- fine volume up  -------------
  4935. FineVolUp:
  4936.     move.w    d3,d7
  4937.     and.w    #$000f,d7
  4938.     lsl.w    #8,d7
  4939.     add.w    d7,VolA(a6)
  4940.     cmp.w    #64*256,VolA(a6)
  4941.     blt.s    FVUOK
  4942.     move.w    #64*256,VolA(a6)
  4943. FVUOK
  4944.     tst.b    channelenable
  4945.     bne.s    FVUClrVolB
  4946.     moveq    #0,d2
  4947.     rts
  4948. FVUClrVolB
  4949.     moveq    #0,d6
  4950.     rts
  4951.  
  4952.  
  4953. ; --------------- fine volume down  -------------
  4954. FineVolDown:
  4955.     move.w    d3,d7
  4956.     and.w    #$000f,d7
  4957.     lsl.w    #8,d7
  4958.     sub.w    d7,VolA(a6)
  4959.     tst.w    VolA(a6)
  4960.     bge.s    FVDOK
  4961.     clr.w    VolA(a6)
  4962. FVDOK
  4963.     tst.b    channelenable
  4964.     bne.s    FVDClrVolB
  4965.     moveq    #0,d2
  4966.     rts
  4967. FVDClrVolB
  4968.     moveq    #0,d6
  4969. NoFVD    rts
  4970.  
  4971.  
  4972. ; ------------- glissando -------------
  4973.  
  4974. ;GlissOldValue:         (a5)
  4975. ;GlissEnable:        1(a5)
  4976. ;GlissOldPeriod:    2(a5)
  4977. ;GlissNewPeriod:    4(a5)
  4978.  
  4979. Glissando:
  4980.     move.w    d3,d7
  4981.     tst.b    d3
  4982.     bne.s    NoOLDgliss
  4983.     move.b    (a5),d3
  4984. NoOLDgliss
  4985.  
  4986.     cmp.b    #1,count
  4987.     bne.s    NoStore
  4988.     move.b    d3,(a5)
  4989. NoStore
  4990.     lea    GlissandoDatasA(a6),a5
  4991.  
  4992.     tst.w    2(a5)
  4993.     beq.w    GlissRTS
  4994.  
  4995. ;    tst.b    channelenable
  4996. ;    bne.s    GlissOK1B
  4997.  
  4998. GlissOK1A:
  4999.     tst.w    4(a5)
  5000.     bne.s    GlissOk2
  5001.     move.w    d0,d7
  5002.     move.w    d0,4(a5)
  5003.     move.w    2(a5),d0
  5004.     clr.b    1(a5)
  5005.     cmp.w    d0,d7
  5006.     beq.s    ClrNP
  5007.     bge.w    GlissRTS
  5008.     move.b    #1,1(a5)
  5009.     rts
  5010.  
  5011. ;GlissOK1B:
  5012. ;    tst.w    4(a5)
  5013. ;    bne.s    GlissOk2
  5014. ;    move.w    d4,d7
  5015. ;    move.w    d4,4(a5)
  5016. ;    move.w    2(a5),d4
  5017. ;    clr.b    1(a5)
  5018. ;    cmp.w    d4,d7
  5019. ;    beq.s    ClrNP
  5020. ;    bge.s    GlissRTS
  5021. ;    move.b    #1,1(a5)
  5022. ;    rts
  5023.  
  5024. ClrNP:    clr.w    4(a5)
  5025.     rts
  5026.  
  5027. GlissOk2:
  5028.     move.w    d3,d7
  5029.     and.w    #$0ff,d7
  5030.     tst.w    4(a5)
  5031.     beq.s    Glissrts
  5032.     tst.b    1(a5)
  5033.     bne.s    Glisssub
  5034.     lsl.w    #2,d7
  5035.     add.w    d7,2(a5)
  5036.     move.w    4(a5),d7
  5037.     cmp.w    2(a5),d7
  5038.     bgt.s    GlissOK3
  5039.     move.w    4(a5),2(a5)
  5040.     clr.w    4(a5)
  5041. GlissOK3:
  5042. ;    tst.b    channelenable
  5043. ;    bne.s    GlissChanB
  5044. ;GlissChanA
  5045.     move.w    2(a5),d0
  5046.     move.w    d0,VibratoDatasA(a6)
  5047.     move.w    d0,VibratoDatasB(a6)
  5048.     rts
  5049.  
  5050. ;GlissChanB
  5051. ;    move.w    2(a5),d0
  5052. ;    rts
  5053.  
  5054. Glisssub:
  5055.     lsl.w    #2,d7
  5056.     sub.w    d7,2(a5)
  5057.     move.w    4(a5),d7
  5058.     cmp.w    2(a5),d7
  5059.     blt.s    GlissOK3
  5060.     move.w    4(a5),2(a5)
  5061.     clr.w    4(a5)
  5062.     bra.s    GlissOK3
  5063.  
  5064. Glissrts:
  5065.     rts
  5066.  
  5067. SlideVolGliss:
  5068.     and.w    #$00ff,d3
  5069.     add.w    #$a00,d3
  5070.     tst.b    channelenable
  5071.     bne.s    SlideChanB
  5072.     lea    VolA(a6),a5
  5073.     bra.s    DoSlideChan
  5074. SlideChanB
  5075.     lea    VolB(a6),a5
  5076. DoSlideChan
  5077.     bsr    SlideVolume
  5078.  
  5079.     move.w    #$0300,d3
  5080.     tst.b    channelenable
  5081.     bne.s    GlissBChan
  5082.     lea    GlissandoDatasA(a6),a5
  5083.     tst.w    d2
  5084.     bne.s    .ok
  5085.     move.w    #$0300,d2
  5086. .ok
  5087.     bra.s    DoGlissChan
  5088. GlissBChan
  5089.     tst.w    d6
  5090.     bne.s    .ok
  5091.     move.w    #$0300,d6
  5092. .ok
  5093.     lea    GlissandoDatasB(a6),a5
  5094. DoGlissChan
  5095.     bra    Glissando
  5096.  
  5097.  
  5098. SlideVolVib:
  5099.     and.w    #$00ff,d3
  5100.     add.w    #$a00,d3
  5101.     tst.b    channelenable
  5102.     bne.s    SlideChanBV
  5103.     lea    VolA(a6),a5
  5104.     bra.s    DoSlideChanV
  5105. SlideChanBV
  5106.     lea    VolB(a6),a5
  5107. DoSlideChanV
  5108.     bsr    SlideVolume
  5109.  
  5110.     move.w    #$0400,d3
  5111.     tst.b    channelenable
  5112.     bne.s    VibBChan
  5113.     lea    VibratoDatasA(a6),a5
  5114.     tst.w    d2
  5115.     bne.s    .ok
  5116.     move.w    #$0400,d2
  5117. .ok
  5118.     bra.s    DoVibChan
  5119. VibBChan
  5120.     lea    VibratoDatasB(a6),a5
  5121.     tst.w    d6
  5122.     bne.s    .ok
  5123.     move.w    #$0400,d6
  5124. .ok
  5125. DoVibChan
  5126.     bra    Vibrato
  5127.  
  5128.  
  5129.  
  5130.  
  5131. ;VibPeriod    (a5)
  5132. ;VibValue    2(a5)
  5133. ;ViboldValue    3(a5)
  5134.  
  5135. Vibrato:
  5136.     movem.l    d2/d5,-(sp)
  5137.  
  5138.     move.w    d0,d2
  5139. ;    tst.b    channelenable
  5140. ;    bne.s    VibCHANB1
  5141. ;    move.w    d0,d2
  5142. ;VibCHANB1
  5143.     bsr    VibratoMain
  5144. ;    tst.b    channelenable
  5145. ;    bne.s    VibCHANB2
  5146. ;    move.w    d2,d0
  5147. ;    bra.s    VibMainDone
  5148. ;VibCHANB2
  5149.     move.w    d2,d0
  5150. VibMainDone
  5151.     movem.l    (sp)+,d2/d5
  5152.     rts
  5153.  
  5154. VibratoMain:
  5155.     move.b    Count(pc),d7
  5156.     cmp.b    Temp(pc),d7
  5157.     bne.s    NoNewPeriod
  5158.     tst.w    (a5)
  5159.     bne.s    NoNewPeriod
  5160.     move.w    d2,(a5)
  5161. NoNewPeriod
  5162.     move.w    (a5),d2
  5163.     move.b    temp(pc),d7
  5164.     subq    #1,d7
  5165.     cmp.b    count(pc),d7
  5166.     bne.s    DoVibrato
  5167.     clr.w    (a5)
  5168.     rts
  5169. DoVibrato
  5170.     move.b    d3,d5
  5171.     and.b    #$0f,d5
  5172.     bne.s    NoNew1
  5173.     move.b    3(a5),d5
  5174.     and.b    #$0f,d5
  5175.     add.b    d5,d3
  5176. NoNew1
  5177.     move.b    d3,d5
  5178.     and.b    #$f0,d5
  5179.     bne.s    NoNew2
  5180.     move.b    3(a5),d5
  5181.     and.b    #$f0,d5
  5182.     add.b    d5,d3
  5183. NoNew2
  5184.     move.w    d3,-(sp)
  5185.  
  5186.     move.b    d3,3(a5)
  5187.  
  5188.     move.b    d3,d7
  5189.     move.b    2(a5),d3
  5190.     lsr.w    #2,d3
  5191.     and.w    #$1f,d3
  5192.     moveq    #0,d5
  5193.     move.b    VibSin(pc,d3.w),d5
  5194.     mulu    #5,d5
  5195.     divu    #3,d5
  5196.     and.l    #$ffff,d5
  5197.  
  5198.     move.b    d7,d3
  5199.     and.w    #$f,d3
  5200.     mulu    d3,d5
  5201.     lsr.w    #7,d5
  5202.  
  5203.     tst.b    2(a5)
  5204.     bmi.s    VibSub
  5205.     add.w    d5,d2
  5206.     bra.s    VibNext
  5207. VibSub:
  5208.     sub.w    d5,d2
  5209. VibNext:
  5210.     move.w    d2,d5
  5211.     move.b    d7,d5
  5212.     lsr.w    #2,d5
  5213.     and.w    #$3c,d5
  5214.     add.b    d5,2(a5)
  5215.     move.w    (sp)+,d3
  5216.     rts
  5217.  
  5218. VibSin:
  5219.     dc.b    $00,$18,$31,$4a,$61,$78,$8d,$a1,$b4,$c5,$d4,$e0,$eb,$f4,$fa,$fd
  5220.     dc.b    $ff,$fd,$fa,$f4,$eb,$e0,$d4,$c5,$b4,$a1,$8d,$78,$61,$4a,$31,$18
  5221.  
  5222.  
  5223. Hex:
  5224.  dc.b    0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,10,11,12,13,14,15,16,17,18,19
  5225.  dc.b    0,0,0,0,0,0,20,21,22,23,24,25,26,27,28,29,0,0,0,0,0,0,30,31
  5226.  dc.b    32,33,34,35,36,37,38,39,0,0,0,0,0,0,40,41,42,43,44,45,46,47
  5227.  dc.b    48,49,0,0,0,0,0,0,50,51,52,53,54,55,56,57,58,59,0,0,0,0,0,0
  5228.  dc.b    60,61,62,63,64,65,66,67,68,69,0,0,0,0,0,0
  5229.  dc.b    70,71,72,73,74,75,76,77,78,79,0,0,0,0,0,0
  5230.  dc.b    80,81,82,83,84,85,86,87,88,89,0,0,0,0,0,0
  5231.  dc.b    90,91,92,93,94,95,96,97,98,99,0,0,0,0,0,0
  5232.  even
  5233.  
  5234. PERIODS:
  5235.  dc.w    856*16,808*16,762*16,720*16,678*16,640*16,604*16,570*16,538*16,508*16,480*16,453*16
  5236.  dc.w    856*8,808*8,762*8,720*8,678*8,640*8,604*8,570*8,538*8,508*8,480*8,453*8
  5237.  dc.w    856*4,808*4,762*4,720*4,678*4,640*4,604*4,570*4,538*4,508*4,480*4,453*4
  5238.  dc.w    428*4,404*4,381*4,360*4,339*4,320*4,302*4,285*4,269*4,254*4,240*4,226*4
  5239.  dc.w    214*4,202*4,190*4,180*4,170*4,160*4,151*4,143*4,135*4,127*4,120*4,113*4
  5240.  dc.w    214*2,202*2,190*2,180*2,170*2,160*2,151*2,143*2,135*2,127*2,120*2,113*2
  5241.  dc.w    214,202,190,180,170,160,151,143,135,127,120,113
  5242.  dc.w    214/2,202/2,190/2,180/2,170/2,160/2,151/2,143/2,135/2,127/2,120/2,113/2
  5243. PERIODSEND:
  5244.  
  5245.  
  5246.     SECTION    DATA,BSS_p
  5247.  
  5248. UnPackedData:    ds.l    128*6
  5249. PattAdresses:    ds.l    1024
  5250. PATTLENS:    ds.w    1024
  5251.  
  5252. SAMVOL:        ds.b    256
  5253. Instruments:    ds.w    256
  5254. SampleType:    ds.b    256    ; 0-8bit ; 1-16bit
  5255.         ds.b    256    ; original
  5256. LoopTab:    ds.b    256
  5257. SAMFIN:        ds.l    256
  5258. SONGORDERS:    ds.w    1024+1
  5259.  
  5260. SONGORDERS0:    ds.w    1024+1
  5261. SONGORDERS1:    ds.w    1024+1
  5262. SONGORDERS2:    ds.w    1024+1
  5263. SONGORDERS3:    ds.w    1024+1
  5264. SONGORDERS4:    ds.w    1024+1
  5265.  
  5266. ahi_samples    ds.b    (4*4)*256
  5267. ModNameBuffer:    ds.b    44
  5268. SongNameBuffer:    ds.b    44
  5269.  
  5270. SongNameBuffer0:ds.b    44
  5271. SongNameBuffer1:ds.b    44
  5272. SongNameBuffer2:ds.b    44
  5273. SongNameBuffer3:ds.b    44
  5274. SongNameBuffer4:ds.b    44
  5275.  
  5276. InstrNames:    ds.b    256*30
  5277. InstrGeneralPan:
  5278.         ds.w    256
  5279.  
  5280.  
  5281. VolEnvelope:    ds.b    [[32*4]+6]*256    ; 1 - type / 2 - point number
  5282. PanEnvelope:    ds.b    [[32*4]+6]*256    ; 1 - type / 2 - point number
  5283.  
  5284. SamBuff:    ds.b    32*(1024+16)
  5285.  
  5286. SampleOffsets    ds.l    128+2
  5287. SampleOffsetsFT    ds.b    128+2
  5288.  
  5289.  
  5290. ; Channels
  5291. Channel1:    ds.b    ChanArea*128
  5292. ahi_channels    ds.l    128
  5293.  
  5294.  
  5295.  
  5296. MODBUFFER:
  5297.     ds.b    128*128-1572
  5298.     ds.b    1572
  5299. Tap_Buffer1:
  5300.     ds.b    2048
  5301. TAP_Buffer2:
  5302.     ds.b    2048
  5303. PackedPattLen:
  5304.     ds.w    1
  5305.  
  5306.  
  5307.  
  5308. MODULE:    incbin    'dh2:betrayal.dbm'
  5309. ENDMODULE:
  5310.